django使用给定列表过滤多对多

0 python django many-to-many object filter

我想要filter一个通过多对多中间关系连接到第二个模型的 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)
Run Code Online (Sandbox Code Playgroud)

设计和预期结果

结果应该是仅选择人员 A,因为他通过成员资格连接到具有条目 1 和 2 的组。我想使用Q对象来完成此类任务。

谁能给我提示吗?

Sac*_*hin 5

Person我认为您想要您将提供给的所有组 ID 中的所有对象。

解决方案

from django.db.models import Q

person_qs = Person.objects.exclude(~(Q(group__id=1) & Q(group__id=2)))
Run Code Online (Sandbox Code Playgroud)

在这里,我用来exclude排除所有不是 1 和 2 的组 ID。

如果您有很多组 ID,则可以使用reduceoperator在单个 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)
Run Code Online (Sandbox Code Playgroud)

这将形成如下查询Q(group__id=1) & Q(group_id=2) &(等等......)