我正在创建一个人员组和成员资格,如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)
可以通过以下方式从Group对象访问Person:
>>>Group.members.name
Django是否创建另一个查询来获取Person?
我可以从Group对象访问date_joined
字段吗?
令我困惑的是,我希望将Person name字段改为:
>>>Group.members.person.name
如果一个人有一个字段'name',并且中间模型有一个字段'name',会发生什么。
答案 0 :(得分:32)
示例中的成员字段是ManyToManyField,因此它是一种访问许多人而不是一个人的方法。 成员字段下的对象实际上是一种特殊类型的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
因此,如果您在会员模型中有一个名为name的字段,您可以像这样访问它:
>>>for membership in my_group.membership_set.all():
>>> print membership.name
访问Person名称的第二种方法是:
>>>for membership in my_group.membership_set.all():
>>> print membership.person.name
希望有所帮助:)
答案 1 :(得分:4)
使用会员级别的经理:
MyGroup.membership_set.all()
而不是:
MyGroup.members.all()