在django关系中访问多对多集合字段

时间:2016-11-21 05:11:27

标签: django django-orm

我有一组类似于下面的模型,其中一个人可以是许多俱乐部的成员,但具有不同的会员类型。在这种情况下,我认为MembershipClub

weak entity
class Person(models.Model):
    name = models.TextField()

class Club(models.Model):
    members = models.ManyToManyField(
            Person,
            related_name="clubs"
            through='Membership'
            )

class Membership(models.Model):
    person = models.ForeignKey(Person)
    club = models.ForeignKey(Club)
    member_type = models.TextField()

我知道我可以通过以下方式访问俱乐部的会员资料:

instance_of_club.membership_set.all()

我可以通过以下方式获得所有人的列表:

instance_of_club.membership_set

但是,我正在尝试为这种情况编写一个序列化程序,并且无法从django Meta类中正确查找“成员资格”详细信息。

Club._meta.many_to_many提供members字段:

<django.db.models.fields.related.ManyToManyField: members>

members上的任何内容都没有说明如何获取_set访问者 - 我需要能够以编程方式获取这些内容。我想要的是能够获得所有ManyToMany through关系的列表,然后获取这些对象,而不仅仅是外来对象。

上下文:

  • members.related.through提供Membership类,但不提供实例集合
  • members.related.related_name没有任何内容
  • Club._meta.get_all_field_names()在列表中提供membership,但不在membership_set

如何获取ManyToMany字段上的through关系对象列表?

1 个答案:

答案 0 :(得分:-1)

您的Club模型应该如下所示:

class Club(models.Model):
    members = models.ManyToManyField(
        Person, related_name='clubs', through='Membership'
    )
  

我知道我可以通过以下方式访问俱乐部的会员资料:

instance_of_club.membership_set.all()
     

我可以通过以下方式获得所有人的列表:

instance_of_club.membership_set

这不是真的! instance_of_club.membership_setMembership模型的俱乐部相关经理。 instance_of_club.membership_set.all()是此相关管理员的QuerySet(也是Membership模型实例):

club_instance.members.all()  # all related Person instances of a club
club_instance.membership_set.all()  # all related Memberships of a club
person_instance.clubs.all()  # all related Club instances of a person
person_instance.membership_set.all()  # all related Memberships of a person