gpt4 book ai didi

django - Django 中间模型中的访问字段

转载 作者:行者123 更新时间:2023-12-03 12:08:05 26 4
gpt4 key购买 nike

我正在创建一个 Person Group 和 Membership,如中间模型的 Django 文档中所述。

class Person(models.Model):
name = models.CharField(max_length=128)

def __unicode__(self):
return self.name

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

def __unicode__(self):
return self.name

class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)

可以通过以下方式从 Group 对象访问 Person:
>>>Group.members.name

Django 是否创建另一个查询来获取 Person?
我可以访问 date_joined来自 Group 对象的字段?

让我感到困惑的是,我希望获得 Person name 字段:
>>>Group.members.person.name

如果 Person 有一个字段“name”并且中间模型有一个字段“name”会发生什么。

最佳答案

您的示例中的 members 字段是 ManyToManyField,因此它是一种访问多人而不是一个人的方法。
members 字段下的对象实际上是一种特殊类型的 Manager,而不是 Person:

>>> print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
要更好地了解经理是什么, see the documentation .
例如,要访问一个人的姓名,您可以执行以下操作:
>>> for person in my_group.members.all():
>>> print person.name
您无法通过成员字段中的经理访问您的成员资格模型中的字段。要访问其中的任何字段,您可以执行以下操作:
>>> for membership in my_group.membership_set.all():
>>> print membership.date_joined
因此,如果您的 Membership 模型中有一个名为 name 的字段,您将像这样访问它:
>>> for membership in my_group.membership_set.all():
>>> print membership.name
访问个人姓名的第二种方法是:
>>> for membership in my_group.membership_set.all():
>>> print membership.person.name
请注意 membership_set是指向成员资格的经理的默认名称,但可以通过指定 related_name 来更改它。在相应的外键中。例如,如果来自 Membership 的外键到 Group将像这样定义:
    group = models.ForeignKey(Group, related_name="group_members")
然后您将使用 group_members 访问管理器:
>>> for membership in my_group.group_members.all():
>>> print membership.name
希望有点帮助:)

关于django - Django 中间模型中的访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com