Django教程中的choice_set.all是什么?

14
在Django教程中:
       {% for choice in question.choice_set.all %}

我找不到关于这个问题的简明解释。我知道在admin.py文件中,我已经在choice模型上创建了一个Question模型的外键,以便对于每个选项都有一个问题。


1
看这里:https://dev59.com/O3I-5IYBdhLWcg3wBjnk 我几分钟前也在找它;-) - Tom83B
.all 是与 Choice.objects.all() 相同的“all”,即查询集方法。请参见 @wim 的答案以了解原因。 - Anentropic
@Tom83B 指出了正确的问题并给出了很好的解释,点个赞。 - Hemant Kumar
1个回答

28
这就是 Django 元类的魔力!由于在 Choice 模型中有一个外键指向 Question 模型,因此在 question 模型的实例中,您会自动获得与之对应的 反向关系,指向可能的选项集合。
question.choice_set.all 是查询集,其中包含将您的 question 实例作为外键指向的选项。
默认情况下,这个反向关系的名称是 choice_set(因为相关模型名为 Choice)。但是,您可以通过在外键上指定 related_name 关键字参数来覆盖此默认名称:
class Choice(models.Model):
    ...
    question = models.ForeignKey(Question, related_name='choices')

7
@wim解释得很好,谢谢。在Django教程文档中真的很令人困惑,因为你最初使用了两个名为“Question”和“Choice”的数据库类模型,所以choice_set.all让你认为应该在Choice类中有一个名为choice_set的方法或类似的东西。 - AdjunctProfessorFalcon
4
这似乎是一个更新和改进(已经很好的)文档的绝佳场所。 - Mallory-Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接