Python django使用给定列表筛选多对多
我想过滤通过多对多中间关系连接到第二个模型的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
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一样正确?