这个 Django 应用程序教程中的 choice _ set 是什么?

在 Django 教程 编写你的第一个 Django 应用程序,第一部分中有这样一行:

p.choice_set.create(choice='Not much', votes=0)

choice_set是如何产生的? 它是什么?

我认为 choice部分是教程中使用的模型 Choice的小写版本,但是什么是 choice_set?你能解释一下吗?

更新: 根据 的回答,我找到了这个文档: 跟踪关系“向后”

32934 次浏览

您在 Choice上创建了一个外键,它将每个外键与 Question相关联。

因此,每个 Choice都显式地有一个 question字段,这是您在模型中声明的。

Django 的 ORM 也遵循从 Question向后的关系,在每个实例上自动生成一个名为 foo_set的字段,其中 Foo是模型,该模型有一个 ForeignKey字段。

choice_set是一个 RelatedManager,它可以创建与 Question实例相关的 Choice对象的查询集,例如 q.choice_set.all()

如果您不喜欢 Django 自动选择的 foo_set命名,或者如果您对同一模型有多个外键并且需要区分它们,那么您可以使用 related_name参数对 ForeignKey选择您自己的重写名称。

这里有两个关键的问题。 首先: choice_set是如何被召唤出来的。 第二: 它是什么?

对于所有像我一样的新开发人员,让我来描述一下我是如何让它变得简单的。让我先回答第二个问题。“是什么”,通过这三个词?模型实例,与该实例相关的对象集.

来自 Django 的 Models.py 教程:

from django.db import models




class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')




class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

实例 :

q = Question.objects.get(pk=3)
# Here q is an instance of model class 'Question'.


c = Choice.objects.get(pk=32)
# Here c is an instance of model class 'Choice'.


'Model Instance' is a single 'ROW' of an entire 'TABLE' of your database

在这里,Question Model被用作 foreign keyChoice Model,因此,所有的 与实例 q 相关的对象集都可以通过以下方法过滤:

q.choice_set.all()

因此,这里的 choice_set是所有与问题相关的选项,它的 pk = 3。

现在,第一个问题的答案需要第三个单词 相关经理.Django 文档 给你:-

如果模型具有 ForeignKey,则外键模型的实例将 可以访问一个 Manager,该 Manager 返回第一个 默认情况下,此 Manager 名为 FOO _ set,其中 FOO 是 源模型名称,小写。此管理器返回 QuerySet,它 可按「检索 对象」部分。

可以使用 Foreign _ key 中的“ related _ name”参数更改此单词(choice _ set)。

question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="choices")

对于通过外键的后向关系:

q.choice_set.all()
# If using related_name, then it is same as
q.choices.all()


# All the choices related to the instance q.

前瞻性关系:

choice_qs = Choice.objects.all()
choice_qs.filter(question=q)
# Same result as above. All the choices related to instance q.