我想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)
结果应该只选择人员A,因为他通过成员资格连接到包含条目1和2的组。我想使用Q
个对象来完成这类任务。
任何人都可以给我一个提示吗?
答案 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,你可以使用exclude
和reduce
在一个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)
之类的查询(等等......)