如何通过与 django 中某些 属性 的关系查询 ManyToMany?
How to query ManyToMany through relationship with some property in django?
class Person(models.Model):
age = models.IntegerField()
class Group(models.Model):
people = models.ManyToManyField(Person,through=Membership)
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
existing = models.BooleanField()
这是简化后的class结构,我想查询的是:
组中的查询集,其中有些人的成员资格满足 existing
为真。
我试过使用 Group.objects.filter(membership__existing=True)
,但它似乎抓住了所有的组。
过滤查询集最有效的方法是什么?
我使用您的模型定义创建了一个示例应用程序,您指定的过滤器工作正常。我必须将 people
字段的 through
属性更改为字符串,因为 Membership
尚未定义。我还在 Group
中添加了一个名称字段,以便于测试。
class Person(models.Model):
age = models.IntegerField()
class Group(models.Model):
name = models.CharField(max_length=255)
people = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
existing = models.BooleanField()
然后在控制台中:
>>> p1 = Person.objects.create(age=10)
>>> p2 = Person.objects.create(age=20)
>>> has_existing = Group.objects.create(name='has_existing')
>>> has_non_existing = Group.objects.create(name='has_non_existing')
>>> has_none = Group.objects.create(name='has_none')
>>> Membership.objects.create(person=p1, group=has_existing, existing=True)
>>> Membership.objects.create(person=p2, group=has_non_existing, existing=False)
>>> existing = Group.objects.filter(membership__existing=True)
>>> assert(len(existing) == 1)
>>> assert(existing[0].name == 'has_existing')
class Person(models.Model):
age = models.IntegerField()
class Group(models.Model):
people = models.ManyToManyField(Person,through=Membership)
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
existing = models.BooleanField()
这是简化后的class结构,我想查询的是:
组中的查询集,其中有些人的成员资格满足 existing
为真。
我试过使用 Group.objects.filter(membership__existing=True)
,但它似乎抓住了所有的组。
过滤查询集最有效的方法是什么?
我使用您的模型定义创建了一个示例应用程序,您指定的过滤器工作正常。我必须将 people
字段的 through
属性更改为字符串,因为 Membership
尚未定义。我还在 Group
中添加了一个名称字段,以便于测试。
class Person(models.Model):
age = models.IntegerField()
class Group(models.Model):
name = models.CharField(max_length=255)
people = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
existing = models.BooleanField()
然后在控制台中:
>>> p1 = Person.objects.create(age=10)
>>> p2 = Person.objects.create(age=20)
>>> has_existing = Group.objects.create(name='has_existing')
>>> has_non_existing = Group.objects.create(name='has_non_existing')
>>> has_none = Group.objects.create(name='has_none')
>>> Membership.objects.create(person=p1, group=has_existing, existing=True)
>>> Membership.objects.create(person=p2, group=has_non_existing, existing=False)
>>> existing = Group.objects.filter(membership__existing=True)
>>> assert(len(existing) == 1)
>>> assert(existing[0].name == 'has_existing')