我正在创建一个人员组和成员资格,如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)
希望有所帮助:)
| 归档时间: |
|
| 查看次数: |
12902 次 |
| 最近记录: |