<model> _set来自我的Django模型?</model>

时间:2013-01-23 15:30:25

标签: python django

我正在浏览Django教程:https://docs.djangoproject.com/en/dev/intro/tutorial01/

我正在研究使用带有manage.py的python shell的示例。代码段从网站复制:

    # Give the Poll a couple of Choices. The create call constructs a new
# Choice object, does the INSERT statement, adds the choice to the set
# of available choices and returns the new Choice object. Django creates
# a set to hold the "other side" of a ForeignKey relation
# (e.g. a poll's choices) which can be accessed via the API.
>>> p = Poll.objects.get(pk=1)

# Display any choices from the related object set -- none so far.
>>> p.choice_set.all()
[]

此示例使用的轮询模型包含问题和答案选项,在此处定义:

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

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField()

现在我不明白对象choice_set的来源。对于一个问题,我们有一组&#34;选择&#34;。但这明确定义在哪里?我似乎只定义了两个类。 models.foreignKey(Poll)方法是否连接两个类(因此表)? 现在后缀&#34; _set&#34;来自choice_set。是因为我们隐含地定义了Poll和Choice表之间的一对多关系,因此我们有一个&#34; set&#34;选择?

3 个答案:

答案 0 :(得分:3)

Django ORM会自动将

choice_set放在那里,因为您有一个从ChoicePoll的外键。这样可以轻松找到特定Choice对象的所有Poll

因此未在任何地方明确定义。

您可以使用related_name参数将字段名称设置为ForeignKey

答案 1 :(得分:2)

关系_set命令 - 在本例中为choice_set - 是关系的API访问器(即ForeignKey,OneToOneField或ManyToManyField)。

您可以阅读有关Django关系,关系API和_set here

的更多信息

答案 2 :(得分:1)

  

但这是明确定义的?

不是;这是Django魔术。

  

我似乎只定义了两个类。 models.foreignKey(Poll)方法是否连接两个类(因此表)?

正确。

  

现在,后缀“_set”来自choice_set。是因为我们隐含地定义了Poll和Choice表之间的一对多关系,因此我们有一组“选择”吗?

是。这只是一个默认值;您可以通过the normal mechanism明确设置名称。