2017-08-14 111 views
0

我想filter Django模型,通过多对多的中间关系连接到第二个模型。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

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

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

回答

1

我想你想的所有Person对象这是在所有的组ID,你会提供它。

解决方案

from django.db.models import Q 

person_qs = Person.objects.exclude(~(Q(group__id=1) & Q(group__id=2))) 

在这里,我用exclude排除所有不属于1个2

如果你有很多IDS组的组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) 

这会形成像Q(group__id=1) & Q(group_id=2) &查询(等等...)

+0

这正是我所期待的!非常感谢! – essin

2

这里没有必要使用Q,它是一个简单的查询。

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

但这将返回b藏汉正确的,因为在行为像OR? – essin