Skip to main content
 首页 » 编程设计

python之Django 关系向后工作没有 _set 但没有

2025年05月04日25jillzhang

我有以下数据库表:

class Story(models.Model): 
    user = models.ForeignKey(User) 
    group = models.ForeignKey(Group, blank=True, null=True) 
    date_added = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 
    location = models.CharField(max_length=100) 
    title = models.CharField(max_length=150) 
    description = models.CharField(blank=True, null=True, max_length=2000) 
    exp_text = models.TextField() 
    category = models.ForeignKey(Category, blank=True, null=True) 
 
    def __unicode__(self): 
        return self.title 
 
class Comment(models.Model): 
    user = models.ForeignKey(User) 
    date_added = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 
    emailOnReply = models.NullBooleanField(blank=True, null=True) 
    comment_text = models.TextField() 
    story = models.ForeignKey(Story) 
 
    def __unicode__(self): 
        return self.comment_text 

当我创建了 Comment 对象并需要访问故事的标题时,我希望能够这样做:

c = Comment.objects.all() 
for com in c: 
    com.comment_set.title 

但是 django 说 comment_set 没有定义。在文档中它说如果你想到达另一个数据库表中没有定义外部的字段你可以使用 _set 方法,它前面的词是类的名称。

在尝试了不同的方法后,我发现这是可行的:

c = Comment.objects.all() 
for com in c: 
    com.story.title 

由于外键是在注释中定义的,所以我看不出它是如何工作的,但它确实有效,为什么 _set 不起作用。由于我在模型中处理定义了外键的对象并且我需要转到故事然后我需要根据文档使用_set ...在处理故事对象时我能够直接引用定义 related_name 属性时的注释模型,所以我也不需要 _set 那里.. 为什么 _set 在这里不起作用?

更新: 当使用故事对象并通过以下方式引用评论类时,我现在得到了倒退的关系:

s = Story.objects.all() 
for st in s: 
    print st.comment_set.all() 

我使用的是 st.story_set 而不是 st.comment_set 但我仍然觉得这很奇怪:

c = Comment.objects.all() 
for com in c: 
    print com.story.title 

当尝试从故事对象工作时,我没有评论表的任何外键(只有评论表中外键的相关名称)所以我似乎没有获得相同的访问权限。

请您参考如下方法:

实际上一切都按预期工作。
评论对象没有评论外键,它有一个“故事”外键。 评论“指向”故事。因此 - 一条评论只有一个故事,但一个故事可能有“一组”评论。

这就是 st.comment_set 起作用的原因 - 因为它“向后看”指向它的评论,而评论只是直接指向它相关的故事(即 com .故事).

如果您有兴趣了解其工作原理 - 请参阅此处:
https://docs.djangoproject.com/en/dev/topics/db/queries/#how-are-the-backward-relationships-possible 这就是 Django 的 ORM 如此酷的部分原因......