访问Django中间模型中的字段

pab*_*blo 19 django model

我正在创建一个人员组和成员资格,如Django docs中间模型所述.

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)
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式从Group对象访问Person:

>>>Group.members.name
Run Code Online (Sandbox Code Playgroud)

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

令我困惑的是我希望获得Person name字段:

>>>Group.members.person.name
Run Code Online (Sandbox Code Playgroud)

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

Mon*_*lik 33

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

>>>print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
Run Code Online (Sandbox Code Playgroud)

要更好地了解Manager是什么,请参阅文档.

要访问某个人的姓名,您可以这样做:

>>>for person in my_group.members.all():
>>>    print person.name
Run Code Online (Sandbox Code Playgroud)

您无法通过"成员"字段中的"管理器"访问"成员资格"模型中的字段.要访问其中的任何字段,您可以:

>>>for membership in my_group.membership_set.all():
>>>    print membership.date_joined
Run Code Online (Sandbox Code Playgroud)

因此,如果您在Membership模型中有一个名为name的字段,您可以像这样访问它:

>>>for membership in my_group.membership_set.all():
>>>    print membership.name
Run Code Online (Sandbox Code Playgroud)

访问Person名称的第二种方法是:

>>>for membership in my_group.membership_set.all():
>>>    print membership.person.name
Run Code Online (Sandbox Code Playgroud)

希望有所帮助:)