我有一个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
相同的代码我也非常确定我可以手动将外键添加到数据库但我想要这是干净而不是hackish。
答案 0 :(得分:38)
您实际上没有循环引用;问题在于,在您定义相册时,尚未定义图像。您可以通过使用字符串来修复它:
class Album(models.model):
thumb = models.ForeignKey('Image', null=True, blank=True)
但是,在这种情况下,您可能希望使用OneToOneField而不是外键。 (注意,你仍然必须使用字符串的技巧)。
答案 1 :(得分:12)
使用引号强制执行惰性引用:
models.ForeignKey('Image', null=True, blank=True)
此外,ForeignKey.related_name是您的朋友(避免反向引用名称冲突)。
答案 2 :(得分:0)
这已经过时了但无论如何,我想说我没有在模型Image中看到属性相册的原因。在我看来,并不是真的需要它。