访问Django中间模型中的字段

时间:2010-01-05 12:28:53

标签: django model

我正在创建一个人员组和成员资格,如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',会发生什么。

2 个答案:

答案 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()