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

时间:2017-08-14 12:15:49

标签: python django object filter many-to-many

我想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)

design and expected result

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

任何人都可以给我一个提示吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我认为你想要你将提供给它的所有组ID中的所有import re >>> re.search('(\d{2})-(\d{2}) (\d{2}),(\d{2})', "23-24 24,57").group(1) '23' >>> re.search('(\d{2})-(\d{2}) (\d{2}),(\d{2})', "23-24 24,57").group(2) '24' >>> re.search('(\d{2})-(\d{2}) (\d{2}),(\d{2})', "23-24 24,57").group(3) '24' >>> re.search('(\d{2})-(\d{2}) (\d{2}),(\d{2})', "23-24 24,57").group(4) '57' 个对象。

<强>解决方案

Person

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

如果你有很多组ID,你可以使用excludereduce在一个for循环中构建查询。

operator

这将构成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) 之类的查询(等等......)