Django 使用完全相同的查询进行多对多过滤

Kus*_*rew 1 django many-to-many

django 中是否有任何方法可以通过查询集或 ids 列表过滤具有多对多关系的对象。在多对多中获取具有完全相同值的查询。模型

class Parent(models.Model):
    name = models.CharField(max_length=1000)
    children = models.ManyToManyField(Child, blank=True)
Run Code Online (Sandbox Code Playgroud)

意见

def filter_parents(request):
    children = Child.objects.filter(id__in=[1,2,3])
    parents = Parent.objects.filter(child=child)
    return parents
Run Code Online (Sandbox Code Playgroud)

预期:我正在寻找在多对多领域拥有完全相同孩子的过滤父母

Ser*_*ach 6

您可以在这种情况下使用链过滤。

from django.db.models import Count

children_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))

for child_id in children_id_list:
    parents = parents.filter(children__id=child_id)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 lambda 过滤:

c_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))
parents = reduce(lambda p, id: parents.filter(child=id), c_id_list, parents)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用Q()查询:

from django.db.models import Count, Q

children_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))

query = Q()
for child_id in children_id_list:
    query &= Q(children__id=child_id)
parents = parents.filter(query)
Run Code Online (Sandbox Code Playgroud)

因此,您将只获得在您的 id 列表中Parent包含所有这些对象的对象children