
class Image(models.Model):    
    description = models.CharField(max_length=500)
    image = models.ImageField(upload_to='images')
    image_revision = models.OneToOneField('ImageRevision', primary_key=True)
    image_static = models.ForeignKey('ImageStatic')
    
    class Meta:
        verbose_name = _(u'Image')
        verbose_name_plural = _(u'Images')
        ordering = ['image_revision']

    def __unicode__(self):
        return self.description


class Revision(models.Model):
    """A report of an older version of some Article."""

    revision_id = models.PositiveIntegerField(_(u"Revision Number"))
    article_static = models.ForeignKey('ArticleStatic', null=True)

    # Editor identification
    editor = models.ForeignKey(User, verbose_name=_(u'Editor'), null=True)
    editor_ip = models.IPAddressField(_(u"IP Address of the Editor"))

    comment = models.CharField(_(u"Editor comment"), max_length=100, blank=True)
    modified = models.DateTimeField(_(u"Modified at"), default=datetime.now)
    reverted = models.ForeignKey('self', null=True)

    objects = RevisionManager()


class ImageRevision(Revision):
    """A report of an older version of some Image."""
    #revision_ptr = models.OneToOneField('Revision',primary_key=True,parent_link=True)
    image_static = models.ForeignKey('ImageStatic')
    class Meta:
        verbose_name = _(u'ImageRevision')
        verbose_name_plural = _(u'ImageRevisions')
        get_latest_by  = 'modified'
        ordering = ('-id',)
    objects = models.Manager()    
    rev_manager = ImageRevisionManager()
    def __unicode__(self):
        return u'#%s' % self.pk

class ImageStatic(models.Model):
    """ Image metadata not under change control
    """
    creator = models.ForeignKey(User, verbose_name=_('Image Creator'), null=True, related_name='createdimage_set')
    creator_ip = models.IPAddressField(_("IP Address of the Image Creator"), blank=True, null=True)
    created_at = models.DateTimeField(default=datetime.now)
    feature_id = models.PositiveIntegerField(null=True, db_index=True, blank=True)
    published = models.BooleanField(default=False)
    project = models.ForeignKey(Project, null=True)
    source_url = models.URLField(verify_exists=False, null=True)
    note_text = models.TextField(default="")
    copy_of = models.ForeignKey("self", null=True, blank=True, related_name='copies') # field to track original copy of an object
    associator = models.ForeignKey(User, null=True, blank=True)


    def latest(self):
        return self.image_set.order_by('image_revision')[0]

    def first(self):
        return self.image_set.order_by('-image_revision')[0]

I have used multi table inheritance in the ImageRevision model. What is heppening when I call image static objects's latest or first method getting a sql error.


>>> project = get_object_or_404(Project, instance='gw')
>>> image_static = get_object_or_404(ALL_IMAGES, pk=54, project=project)
>>> rev = image_static.imagerevision_set.count()
>>> rev = image_static.image_set.count()
>>> rev = image_static.image_set.order_by('revision')[0]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
_getitem__
    return list(qs)[0]
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
_len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
terator
    for row in self.query.results_iter():
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
in results_iter
    for rows in self.execute_sql(MULTI):
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1724,
 in execute_sql
    sql, params = self.as_sql()
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 261,
in as_sql
    ordering = self.get_ordering()
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 656,
in get_ordering
    self.model._meta, default_order=asc):
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 684,
in find_ordering_name
    opts, alias, False)
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1321,
 in setup_joins
    "Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'revision' into field. Choices are: article,
description, image, image_revision, image_static
>>> rev = image_static.image_set.order_by('imagerevision')[0]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
_getitem__
    return list(qs)[0]
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
_len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
terator
    for row in self.query.results_iter():
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
in results_iter
    for rows in self.execute_sql(MULTI):
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1724,
 in execute_sql
    sql, params = self.as_sql()
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 261,
in as_sql
    ordering = self.get_ordering()
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 656,
in get_ordering
    self.model._meta, default_order=asc):
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 684,
in find_ordering_name
    opts, alias, False)
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1321,
 in setup_joins
    "Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'imagerevision' into field. Choices are: arti
cle, description, image, image_revision, image_static
>>> rev = image_static.image_set.order_by('image_revision')[0]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
_getitem__
    return list(qs)[0]
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
_len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
terator
    for row in self.query.results_iter():
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
in results_iter
    for rows in self.execute_sql(MULTI):
  File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1734,
 in execute_sql
    cursor.execute(sql, params)
  File "C:\Python25\Lib\site-packages\django\db\backends\util.py", line 19, in e
xecute
    return self.cursor.execute(sql, params)
  File "C:\Python25\Lib\site-packages\django\db\backends\mysql\base.py", line 83
, in execute
    return self.cursor.execute(query, args)
  File "C:\Python25\lib\site-packages\MySQLdb\cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python25\lib\site-packages\MySQLdb\connections.py", line 35, in defau
lterrorhandler
    raise errorclass, errorvalue
OperationalError: (1054, "Unknown column 'cms_imagerevision.revision_ptr_id' in
'on clause'")


I can see from the sql query that it is referring a column which is not in the JOIN statement. 

I have printed sql query and it is this one:

SELECT `cms_image`.`description`, `cms_image`.`image`, `cms_image`.`image_revision_id`, `cms_image`.`image_static_id` FROM `cms_image` 
INNER JOIN `cms_revision` ON (`cms_imagerevision`.`revision_ptr_id` = `cms_revision`.`id`) WHERE `cms_image`.`image_static_id` = 54  
ORDER BY `cms_image`.`image_revision_id` DESC 

Same error happens when image objects delete method is called.


