多个多对多行的Django过滤器
Django filter on multiple many-to-many rows
我是 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)
我可以过滤与一个组相关的人
persons=Person.objects.filter(Q(group__name='Group1'))
但我想要实现的是过滤正好属于两组的人。
示例:
- Person1 在 Group1 中
- Person2 在 Group1 和 Group2 中。
过滤器应该只 return Person2.
关于如何为此创建过滤器的任何提示?
我认为应该这样做...
groups = ["Group1","Group2"]
persons = Person.objects.annotate(count=Count('name')).filter(count__gte=len(groups)).filter(reduce(operator.or_, (Q(group__name=x) for x in groups)))
我是 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)
我可以过滤与一个组相关的人
persons=Person.objects.filter(Q(group__name='Group1'))
但我想要实现的是过滤正好属于两组的人。
示例:
- Person1 在 Group1 中
- Person2 在 Group1 和 Group2 中。
过滤器应该只 return Person2.
关于如何为此创建过滤器的任何提示?
我认为应该这样做...
groups = ["Group1","Group2"]
persons = Person.objects.annotate(count=Count('name')).filter(count__gte=len(groups)).filter(reduce(operator.or_, (Q(group__name=x) for x in groups)))