Python django使用给定列表筛选多对多

Python django使用给定列表筛选多对多,python,django,object,filter,many-to-many,Python,Django,Object,Filter,Many To Many,我想过滤通过多对多中间关系连接到第二个模型的Django模型 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.M

我想过滤通过多对多中间关系连接到第二个模型的Django模型

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)

结果应该是只选择一个人,因为他通过成员身份连接到条目1和条目2的组。我想使用
Q
对象来完成这类任务


有人能给我一个提示吗?

这里不需要使用Q,它是一个简单的查询

Person.objects.filter(group__id__in=[1, 2])

这里不需要使用Q,它是一个简单的查询

Person.objects.filter(group__id__in=[1, 2])

我认为您需要所有的
Person
对象,这些对象位于您将提供给它的所有组ID中

解决方案

from django.db.models import Q

person_qs = Person.objects.exclude(~(Q(group__id=1) & Q(group__id=2)))
在这里,我使用
exclude
排除所有不是1和2的组ID

如果有很多组ID,可以使用
reduce
operator
在单个for循环中构建查询

from functools import reduce
import operator

query = reduce(operator.and_, (Q(group__id=group_id) for group_id in group_ids))

persons_qs = Person.objects.exclude(~query)

这将形成查询,如
Q(group\u id=1)&Q(group\u id=2)&
(以此类推)

我想您需要所有的
Person
对象,这些对象位于您将提供给它的所有组id中

解决方案

from django.db.models import Q

person_qs = Person.objects.exclude(~(Q(group__id=1) & Q(group__id=2)))
在这里,我使用
exclude
排除所有不是1和2的组ID

如果有很多组ID,可以使用
reduce
operator
在单个for循环中构建查询

from functools import reduce
import operator

query = reduce(operator.and_, (Q(group__id=group_id) for group_id in group_ids))

persons_qs = Person.objects.exclude(~query)

这将形成类似于
Q(group\u id=1)&Q(group\u id=2)&
(依此类推)

的查询,但这将返回B,与acts like OR中的B一样正确?但这将返回B,与acts like OR中的B一样正确?