Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中间模型中的访问字段_Django_Model - Fatal编程技术网

Django中间模型中的访问字段

Django中间模型中的访问字段,django,model,Django,Model,我正在为中间模型创建Django文档中描述的个人组和成员资格 班级人员(models.Model): name=models.CharField(最大长度=128) def ___; unicode(自): 返回self.name 类别组(models.Model): name=models.CharField(最大长度=128) members=models.ManyToManyField(Person,通过class='Membership') def ___; unicode(自): 返回

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

班级人员(models.Model):
name=models.CharField(最大长度=128)
def ___; unicode(自):
返回self.name
类别组(models.Model):
name=models.CharField(最大长度=128)
members=models.ManyToManyField(Person,通过class='Membership')
def ___; unicode(自):
返回self.name
班级成员资格(models.Model):
person=型号。外键(person)
组=型号。外键(组)
date\u joined=models.DateField()
invite\u reason=models.CharField(最大长度=64)
可以通过以下方式从组对象访问人员:

>>>Group.members.name
Django是否创建另一个查询来获取此人? 我可以从组对象访问加入日期字段吗

让我困惑的是,我希望获得人名字段时使用:

>>>Group.members.person.name

如果一个人有一个字段“name”,而中间模型也有一个字段“name”,会发生什么情况呢?

在您的示例中,members字段是ManyToManyField,因此它是访问多个人而不是一个人的一种方式。 “成员”字段下的对象实际上是一种特殊类型的经理,而不是个人:

>>> print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
您不能通过成员字段中的管理器访问成员模型中的字段。要访问其中的任何字段,请执行以下操作:

>>> for membership in my_group.membership_set.all():
>>>     print membership.date_joined
因此,如果您的成员资格模型中有一个名为name的字段,那么您可以这样访问它:

>>> for membership in my_group.membership_set.all():
>>>     print membership.name
访问某人姓名的第二种方法是:

>>> for membership in my_group.membership_set.all():
>>>     print membership.person.name
请注意,
membership\u set
是指向成员身份的管理器的默认名称,但是可以通过在相应的外键中指定
related\u name
来更改该名称。例如,如果从
成员身份
的外键定义如下:

    group = models.ForeignKey(Group, related_name="group_members")
然后您可以使用
组成员访问管理器

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

希望这有点帮助:)

使用会员类管理员:

MyGroup.membership_set.all()
而不是:

MyGroup.members.all()

你说的很有道理,也符合我对django模型的理解。让我困惑的是关于intemedaite模型的django文档,他们在上面的示例中使用了相同的模型:#查找所有组,其中的成员名称以'Paul'>>>Group.objects.filter(members_uuname_ustartswith='Paul')[]开头,我希望它是:>>>Group.objects.filter(members_uperson_uname_ustartswith='Paul'),它是“Group.objects.filter(members__name__startswith='Paul')”因为成员是一个管理者。你必须确保你理解成员不是一个成员对象,而是一个多个相关的管理者对象。如果你输入“python manage.py shell”,我想如果你阅读更多关于管理者到底是什么的内容,可能会对你有所帮助“在一个有这些模型的项目中,你可以尝试加入“Group.objects.filter(members\uuu person\uu name\uuu startswith='Paul')”,看看会发生什么——也许这会对你有所帮助?我知道成员是经理,我也读过关于经理的书。我不明白成员们是如何决定用人名而不是团体名的。两者都有这个领域。成员资格也可能有一个字段名。我会过滤吗?每个经理都处理特定类型的对象。“成员”字段中的管理器处理人员对象,而不是成员对象。我只访问了中间表中的数据(答案中说明了如何访问),到目前为止,我从未需要对其进行过滤。但是我建议您自己在pythonshell中尝试一下(“manage.pyshell”命令)。我认为您可以使用“Group.objects.filter(membership\uu date\u joined='1962-02-12')”。如果成员资格有一个名称字段,那么“Group.objects.filter(Membership)而不是“Group.objects.filter(members)Group.objects.filter(Membership)Group.objects.filter(Membership)person.filter(Membership)person(Membership))也可能起作用。但我不确定——我建议你自己试试:)最重要的是,Django的错误消息非常有用。我只是偶尔被他们难倒。
MyGroup.members.all()