如何通过与django中某些属性的关系查询ManyToMany?

DBL*_*Lee 2 django many-to-many

class Person(models.Model):
    age = models.IntegerField()

class Group(models.Model):
    people = models.ManyToManyField(Person,through=Membership)

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    existing = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

这是简化的类结构,我想要查询的是:组上的查询集,其中有些人具有这样的成员资格,这existing是正确的。我尝试过使用,Group.objects.filter(membership__existing=True)但它似乎抓住了所有组。

过滤查询集最有效的方法是什么?

kei*_*thb 5

我使用您的模型定义创建了一个示例应用程序,并且您指定的过滤器工作正常。我必须将字段through的属性更改people为字符串,因为Membership尚未定义。我还添加了一个名称字段以Group使其更易于测试。

class Person(models.Model):
    age = models.IntegerField()

class Group(models.Model):
    name = models.CharField(max_length=255)
    people = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    existing = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

然后在控制台中:

>>> p1 = Person.objects.create(age=10)
>>> p2 = Person.objects.create(age=20)
>>> has_existing = Group.objects.create(name='has_existing')
>>> has_non_existing = Group.objects.create(name='has_non_existing')
>>> has_none = Group.objects.create(name='has_none')
>>> Membership.objects.create(person=p1, group=has_existing, existing=True)
>>> Membership.objects.create(person=p2, group=has_non_existing, existing=False)
>>> existing = Group.objects.filter(membership__existing=True)
>>> assert(len(existing) == 1)
>>> assert(existing[0].name == 'has_existing')
Run Code Online (Sandbox Code Playgroud)