Django中间模型中的访问字段 [英] Access fields in Django intermediate model
问题描述
我正在按照中间层模型的Django文档中所述创建人员组和成员资格.
I'm creating a Person Group and Membership as described in Django docs for intermediate model.
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)
可以通过以下方式从组"对象访问人":
It is possible to access the Person from a Group object with:
>>>Group.members.name
Django是否创建另一个查询以获取Person?我可以从组对象访问 date_joined
字段吗?
Does Django creates another query to fetch the Person?
Can I access the date_joined
field from a Group object?
让我感到困惑的是,我希望得到人名"字段:
The thing that confuses me is that I would expect to get the Person name field with:
>>>Group.members.person.name
如果一个人有一个字段名称",并且中间模型也有一个字段名称",会发生什么情况.
What happens if a Person has a field 'name' and also the intermediate model have a field 'name'.
推荐答案
示例中的member字段是ManyToManyField,因此它是一种访问许多人而不是一个人的方法.成员字段下的对象实际上是一种特殊类型的Manager,而不是Person:
The members field in your example is a ManyToManyField, so it's a way to access many people rather than one person. The object that is under the members field is actually a special type of Manager, not a Person:
>>> print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
要更好地了解经理是什么,请请参阅文档.
To understand better what a Manager is, see the documentation.
例如,要访问一个人的名字,请执行以下操作:
To access a person's name you would do for example:
>>> for person in my_group.members.all():
>>> print person.name
您无法通过Manager的member字段访问Membership模型中的字段.要访问其中的任何字段,您可以执行以下操作:
You cannot access the fields in your Membership model via the Manager in the members field. To access any of the fields in it you would do:
>>> for membership in my_group.membership_set.all():
>>> print membership.date_joined
因此,如果您的成员资格模型中有一个名为name的字段,则可以按以下方式访问它:
And so if you had a field called name in your Membership model, you would access it like this:
>>> for membership in my_group.membership_set.all():
>>> print membership.name
访问人员姓名的第二种方法是:
A second way to access a Person's name would be:
>>> for membership in my_group.membership_set.all():
>>> print membership.person.name
请注意, membership_set
是指向成员资格的管理者的默认名称,但是可以通过在相应的外键中指定 related_name
来更改.例如,如果从 Membership
到 Group
的外键的定义如下:
Note that membership_set
is a default name for the manager pointing towards the membership, but it can be changed by specifying related_name
in the corresponding foreign key. For example if the foreign key from the Membership
to the Group
would be defined like such:
group = models.ForeignKey(Group, related_name="group_members")
然后,您将使用 group_members
来访问管理器:
Then you would access the manager using group_members
:
>>> for membership in my_group.group_members.all():
>>> print membership.name
希望能有所帮助:)
这篇关于Django中间模型中的访问字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!