Django 中间模型中的访问字段 [英] Access fields in Django intermediate model

查看:23
本文介绍了Django 中间模型中的访问字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为中间模型创建 Django 文档中所述的人员组和成员资格.

class Person(models.Model):name = models.CharField(max_length=128)def __unicode__(self):返回 self.name类组(模型.模型):name = models.CharField(max_length=128)成员 = models.ManyToManyField(Person, through='Membership')def __unicode__(self):返回 self.name类成员资格(模型.模型):人 = 模型.ForeignKey(人)group = models.ForeignKey(Group)date_joined = models.DateField()邀请原因 = 模型.CharField(max_length=64)

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

>>>Group.members.name

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

让我感到困惑的是,我希望通过以下方式获取人员姓名字段:

>>>Group.members.person.name

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

解决方案

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

<预><代码>>>>打印 my_group.members<django.db.models.fields.related.ManyRelatedManager 对象在 0x181f7d0>

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

要访问某人的姓名,您可以执行以下操作:

<预><代码>>>>对于 my_group.members.all() 中的人:>>>打印person.name

您无法通过成员字段中的经理访问您的成员资格模型中的字段.要访问其中的任何字段,您可以执行以下操作:

<预><代码>>>>对于 my_group.membership_set.all() 中的成员资格:>>>打印membership.date_joined

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

<预><代码>>>>对于 my_group.membership_set.all() 中的成员资格:>>>打印membership.name

访问个人姓名的第二种方法是:

<预><代码>>>>对于 my_group.membership_set.all() 中的成员资格:>>>打印membership.person.name

请注意,membership_set 是指向成员资格的经理的默认名称,但可以通过在相应的外键中指定 related_name 来更改它.例如,如果从 MembershipGroup 的外键定义如下:

 group = models.ForeignKey(Group,related_name=group_members")

然后您将使用 group_members 访问管理器:

<预><代码>>>>对于 my_group.group_members.all() 中的成员资格:>>>打印membership.name

希望有所帮助:)

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

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'.

解决方案

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

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

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

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")

Then you would access the manager using group_members:

>>> for membership in my_group.group_members.all():
>>>     print membership.name

Hope that helps a little :)

这篇关于Django 中间模型中的访问字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆