Django过滤多个多对多行

时间:2016-03-05 12:20:58

标签: django many-to-many django-filter django-q

我对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中。

过滤器应该只返回Person2。

有关如何为此创建过滤器的任何提示吗?

1 个答案:

答案 0 :(得分:0)

我认为应该这样做......

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