我有一个django应用程序,它基本上只是一个相册。现在我有两个模型:Image
和Album
。其中,每个Album
都有一个指向Image
的外键作为其缩略图,每个Image
都有一个指向其所属Album
的外键。然而,当我尝试使用manage.py syncdb
或manage.py sqlall
时,我得到的错误是,当在定义的第一个类中使用时,没有在models.py中定义的类没有被定义。
models.py (删节):
from django.db import models
import os
class Album(models.Model):
thumb = models.ForeignKey(Image, null=True, blank=True)
class Image(models.Model):
image = models.ImageField(upload_to='t_pics/images')
thumb = models.ImageField(upload_to='t_pics/images/thumbs')
album = models.ForeignKey(Album)
执行manage.py sqlall appname
时出现错误
[...]
File "/path/to/file/appname/models.py", line 4, in ?
class Album(models.Model):
File "/path/to/file/appname/models.py", line 5, in Album
thumb = models.ForeignKey(Image, null=True, blank=True)
NameError: name 'Image' is not defined
当我在models.py中更改类的顺序时,我得到了同样的错误,除了它显示'Album' undefined
而不是'Image' undefined
。我还尝试注释第一个类中的依赖项,然后在成功导入所有其他类后取消注释,但这没有帮助。我应该怎么做才能让它工作呢?我不愿意创建一个完整的第三类Thumb
,因为它有很多与Image
相同的代码,我也非常确定我可以手动将外键添加到数据库中,但我希望这是干净的,而不是黑客的。
发布于 2010-09-10 13:54:12
实际上,您并没有循环引用;问题是,在定义相册时,您还没有定义Image。您可以通过使用字符串来解决此问题:
class Album(models.model):
thumb = models.ForeignKey('Image', null=True, blank=True)
但是,在这种情况下,您可能希望使用OneToOneField而不是外键。(请注意,您仍然必须对字符串使用技巧)。
发布于 2010-09-10 13:59:47
使用引号强制使用惰性引用:
models.ForeignKey('Image', null=True, blank=True)
此外,ForeignKey.related_name是您的朋友(避免反向引用名称冲突)。
发布于 2013-11-21 02:27:03
这是旧的,但不管怎样,我想说在模型Image中我看不到一个属性相册的原因。在我看来,这并不是真正需要的。
https://stackoverflow.com/questions/3682513
复制相似问题