Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过与django中的某些属性的关系查询ManyToMany?_Django_Many To Many - Fatal编程技术网

如何通过与django中的某些属性的关系查询ManyToMany?

如何通过与django中的某些属性的关系查询ManyToMany?,django,many-to-many,Django,Many To Many,这是简化的类结构,我想查询的是: 组上的查询集,这样就有一些人具有成员资格,因此现有为真。 我尝试过使用Group.objects.filter(membership\uu existing=True),但它似乎抓住了所有的组 过滤查询集最有效的方法是什么?我使用您的模型定义创建了一个示例应用程序,您指定的过滤器工作正常。我必须通过人员字段的属性将更改为字符串,因为成员身份尚未定义。我还向Group添加了一个name字段,以便于测试 class Person(models.Model):

这是简化的类结构,我想查询的是: 组上的查询集,这样就有一些人具有成员资格,因此
现有
为真。 我尝试过使用
Group.objects.filter(membership\uu existing=True)
,但它似乎抓住了所有的组


过滤查询集最有效的方法是什么?

我使用您的模型定义创建了一个示例应用程序,您指定的过滤器工作正常。我必须通过
人员
字段的
属性将
更改为字符串,因为
成员身份
尚未定义。我还向
Group
添加了一个name字段,以便于测试

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

谢谢你的评论。我再次进行了测试,发现我的真实代码使用了
NullBooleanField
,我想要的条件是它为null。所以我使用了
过滤器(membership\uuuuu existing\uuuuu isnull=True)
,它还将包括那些没有任何成员资格的过滤器。更改为
过滤器后工作正常(membership\uuuuIsNull=False,membership\uuuuuIsNull=True)
>>> 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')