1 |
|
---|
2 | class Image(models.Model):
|
---|
3 | description = models.CharField(max_length=500)
|
---|
4 | image = models.ImageField(upload_to='images')
|
---|
5 | image_revision = models.OneToOneField('ImageRevision', primary_key=True)
|
---|
6 | image_static = models.ForeignKey('ImageStatic')
|
---|
7 |
|
---|
8 | class Meta:
|
---|
9 | verbose_name = _(u'Image')
|
---|
10 | verbose_name_plural = _(u'Images')
|
---|
11 | ordering = ['image_revision']
|
---|
12 |
|
---|
13 | def __unicode__(self):
|
---|
14 | return self.description
|
---|
15 |
|
---|
16 |
|
---|
17 | class Revision(models.Model):
|
---|
18 | """A report of an older version of some Article."""
|
---|
19 |
|
---|
20 | revision_id = models.PositiveIntegerField(_(u"Revision Number"))
|
---|
21 | article_static = models.ForeignKey('ArticleStatic', null=True)
|
---|
22 |
|
---|
23 | # Editor identification
|
---|
24 | editor = models.ForeignKey(User, verbose_name=_(u'Editor'), null=True)
|
---|
25 | editor_ip = models.IPAddressField(_(u"IP Address of the Editor"))
|
---|
26 |
|
---|
27 | comment = models.CharField(_(u"Editor comment"), max_length=100, blank=True)
|
---|
28 | modified = models.DateTimeField(_(u"Modified at"), default=datetime.now)
|
---|
29 | reverted = models.ForeignKey('self', null=True)
|
---|
30 |
|
---|
31 | objects = RevisionManager()
|
---|
32 |
|
---|
33 |
|
---|
34 | class ImageRevision(Revision):
|
---|
35 | """A report of an older version of some Image."""
|
---|
36 | #revision_ptr = models.OneToOneField('Revision',primary_key=True,parent_link=True)
|
---|
37 | image_static = models.ForeignKey('ImageStatic')
|
---|
38 | class Meta:
|
---|
39 | verbose_name = _(u'ImageRevision')
|
---|
40 | verbose_name_plural = _(u'ImageRevisions')
|
---|
41 | get_latest_by = 'modified'
|
---|
42 | ordering = ('-id',)
|
---|
43 | objects = models.Manager()
|
---|
44 | rev_manager = ImageRevisionManager()
|
---|
45 | def __unicode__(self):
|
---|
46 | return u'#%s' % self.pk
|
---|
47 |
|
---|
48 | class ImageStatic(models.Model):
|
---|
49 | """ Image metadata not under change control
|
---|
50 | """
|
---|
51 | creator = models.ForeignKey(User, verbose_name=_('Image Creator'), null=True, related_name='createdimage_set')
|
---|
52 | creator_ip = models.IPAddressField(_("IP Address of the Image Creator"), blank=True, null=True)
|
---|
53 | created_at = models.DateTimeField(default=datetime.now)
|
---|
54 | feature_id = models.PositiveIntegerField(null=True, db_index=True, blank=True)
|
---|
55 | published = models.BooleanField(default=False)
|
---|
56 | project = models.ForeignKey(Project, null=True)
|
---|
57 | source_url = models.URLField(verify_exists=False, null=True)
|
---|
58 | note_text = models.TextField(default="")
|
---|
59 | copy_of = models.ForeignKey("self", null=True, blank=True, related_name='copies') # field to track original copy of an object
|
---|
60 | associator = models.ForeignKey(User, null=True, blank=True)
|
---|
61 |
|
---|
62 |
|
---|
63 | def latest(self):
|
---|
64 | return self.image_set.order_by('image_revision')[0]
|
---|
65 |
|
---|
66 | def first(self):
|
---|
67 | return self.image_set.order_by('-image_revision')[0]
|
---|
68 |
|
---|
69 | 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.
|
---|
70 |
|
---|
71 |
|
---|
72 | >>> project = get_object_or_404(Project, instance='gw')
|
---|
73 | >>> image_static = get_object_or_404(ALL_IMAGES, pk=54, project=project)
|
---|
74 | >>> rev = image_static.imagerevision_set.count()
|
---|
75 | >>> rev = image_static.image_set.count()
|
---|
76 | >>> rev = image_static.image_set.order_by('revision')[0]
|
---|
77 | Traceback (most recent call last):
|
---|
78 | File "<console>", line 1, in <module>
|
---|
79 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
|
---|
80 | _getitem__
|
---|
81 | return list(qs)[0]
|
---|
82 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
|
---|
83 | _len__
|
---|
84 | self._result_cache.extend(list(self._iter))
|
---|
85 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
|
---|
86 | terator
|
---|
87 | for row in self.query.results_iter():
|
---|
88 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
|
---|
89 | in results_iter
|
---|
90 | for rows in self.execute_sql(MULTI):
|
---|
91 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1724,
|
---|
92 | in execute_sql
|
---|
93 | sql, params = self.as_sql()
|
---|
94 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 261,
|
---|
95 | in as_sql
|
---|
96 | ordering = self.get_ordering()
|
---|
97 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 656,
|
---|
98 | in get_ordering
|
---|
99 | self.model._meta, default_order=asc):
|
---|
100 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 684,
|
---|
101 | in find_ordering_name
|
---|
102 | opts, alias, False)
|
---|
103 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1321,
|
---|
104 | in setup_joins
|
---|
105 | "Choices are: %s" % (name, ", ".join(names)))
|
---|
106 | FieldError: Cannot resolve keyword 'revision' into field. Choices are: article,
|
---|
107 | description, image, image_revision, image_static
|
---|
108 | >>> rev = image_static.image_set.order_by('imagerevision')[0]
|
---|
109 | Traceback (most recent call last):
|
---|
110 | File "<console>", line 1, in <module>
|
---|
111 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
|
---|
112 | _getitem__
|
---|
113 | return list(qs)[0]
|
---|
114 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
|
---|
115 | _len__
|
---|
116 | self._result_cache.extend(list(self._iter))
|
---|
117 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
|
---|
118 | terator
|
---|
119 | for row in self.query.results_iter():
|
---|
120 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
|
---|
121 | in results_iter
|
---|
122 | for rows in self.execute_sql(MULTI):
|
---|
123 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1724,
|
---|
124 | in execute_sql
|
---|
125 | sql, params = self.as_sql()
|
---|
126 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 261,
|
---|
127 | in as_sql
|
---|
128 | ordering = self.get_ordering()
|
---|
129 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 656,
|
---|
130 | in get_ordering
|
---|
131 | self.model._meta, default_order=asc):
|
---|
132 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 684,
|
---|
133 | in find_ordering_name
|
---|
134 | opts, alias, False)
|
---|
135 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1321,
|
---|
136 | in setup_joins
|
---|
137 | "Choices are: %s" % (name, ", ".join(names)))
|
---|
138 | FieldError: Cannot resolve keyword 'imagerevision' into field. Choices are: arti
|
---|
139 | cle, description, image, image_revision, image_static
|
---|
140 | >>> rev = image_static.image_set.order_by('image_revision')[0]
|
---|
141 | Traceback (most recent call last):
|
---|
142 | File "<console>", line 1, in <module>
|
---|
143 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 238, in _
|
---|
144 | _getitem__
|
---|
145 | return list(qs)[0]
|
---|
146 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 162, in _
|
---|
147 | _len__
|
---|
148 | self._result_cache.extend(list(self._iter))
|
---|
149 | File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 275, in i
|
---|
150 | terator
|
---|
151 | for row in self.query.results_iter():
|
---|
152 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 206,
|
---|
153 | in results_iter
|
---|
154 | for rows in self.execute_sql(MULTI):
|
---|
155 | File "C:\Python25\Lib\site-packages\django\db\models\sql\query.py", line 1734,
|
---|
156 | in execute_sql
|
---|
157 | cursor.execute(sql, params)
|
---|
158 | File "C:\Python25\Lib\site-packages\django\db\backends\util.py", line 19, in e
|
---|
159 | xecute
|
---|
160 | return self.cursor.execute(sql, params)
|
---|
161 | File "C:\Python25\Lib\site-packages\django\db\backends\mysql\base.py", line 83
|
---|
162 | , in execute
|
---|
163 | return self.cursor.execute(query, args)
|
---|
164 | File "C:\Python25\lib\site-packages\MySQLdb\cursors.py", line 166, in execute
|
---|
165 | self.errorhandler(self, exc, value)
|
---|
166 | File "C:\Python25\lib\site-packages\MySQLdb\connections.py", line 35, in defau
|
---|
167 | lterrorhandler
|
---|
168 | raise errorclass, errorvalue
|
---|
169 | OperationalError: (1054, "Unknown column 'cms_imagerevision.revision_ptr_id' in
|
---|
170 | 'on clause'")
|
---|
171 |
|
---|
172 |
|
---|
173 | I can see from the sql query that it is referring a column which is not in the JOIN statement.
|
---|
174 |
|
---|
175 | I have printed sql query and it is this one:
|
---|
176 |
|
---|
177 | SELECT `cms_image`.`description`, `cms_image`.`image`, `cms_image`.`image_revision_id`, `cms_image`.`image_static_id` FROM `cms_image`
|
---|
178 | INNER JOIN `cms_revision` ON (`cms_imagerevision`.`revision_ptr_id` = `cms_revision`.`id`) WHERE `cms_image`.`image_static_id` = 54
|
---|
179 | ORDER BY `cms_image`.`image_revision_id` DESC
|
---|
180 |
|
---|
181 | Same error happens when image objects delete method is called.
|
---|
182 |
|
---|
183 |
|
---|