首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django models.py循环外键

Django models.py循环外键
EN

Stack Overflow用户
提问于 2010-09-10 13:50:45
回答 3查看 9.1K关注 0票数 20

我有一个django应用程序,它基本上只是一个相册。现在我有两个模型:ImageAlbum。其中,每个Album都有一个指向Image的外键作为其缩略图,每个Image都有一个指向其所属Album的外键。然而,当我尝试使用manage.py syncdbmanage.py sqlall时,我得到的错误是,当在定义的第一个类中使用时,没有在models.py中定义的类没有被定义。

models.py (删节):

代码语言:javascript
复制
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时出现错误

代码语言:javascript
复制
[...]
 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相同的代码,我也非常确定我可以手动将外键添加到数据库中,但我希望这是干净的,而不是黑客的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-10 13:54:12

实际上,您并没有循环引用;问题是,在定义相册时,您还没有定义Image。您可以通过使用字符串来解决此问题:

代码语言:javascript
复制
class Album(models.model):
  thumb = models.ForeignKey('Image', null=True, blank=True)

但是,在这种情况下,您可能希望使用OneToOneField而不是外键。(请注意,您仍然必须对字符串使用技巧)。

票数 43
EN

Stack Overflow用户

发布于 2010-09-10 13:59:47

使用引号强制使用惰性引用:

代码语言:javascript
复制
models.ForeignKey('Image', null=True, blank=True)

此外,ForeignKey.related_name是您的朋友(避免反向引用名称冲突)。

票数 13
EN

Stack Overflow用户

发布于 2013-11-21 02:27:03

这是旧的,但不管怎样,我想说在模型Image中我看不到一个属性相册的原因。在我看来,这并不是真正需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3682513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档