首页 > 解决方案 > 子对象的Django链过滤器

问题描述

我有父模型和子模型,并尝试按条件过滤链子对象

objects = Parent.objects.all()

if val1:
    objects = objects.filter(children__arg1=val1)
if val2:
    objects = objects.filter(children__arg2=val2)

如果我创建一个子过滤链,Django 会像这样使用单独的 WHERE Smth 进行几次 JOIN:

    JOIN "children" c1 ON c1."parent_id" = "parent"."id"
    JOIN "children" c2 ON c2."parent_id" = "parent"."id"
WHERE
    c1."arg1" = val1 AND
    c2."arg2" = val2

我可以先过滤 Child :

filtered_children = Child.objects.all()

if val1:
    filtered_children = filtered_children.filter(arg1=val1)
if val2:
    filtered_children = filtered_children.filter(arg2=val2)

接着

objects = Parent.objects.filter(children__in=filtered_children)

但后来我失去了没有孩子的物品。所以我必须这样做:

objects = Parent.objects.all()
if val1 or val2: #'filter was applied' detection
    objects = objects.filter(children__in=filtered_children)

看起来很糟糕。有没有更好的方法来按条件过滤子对象?

标签: djangodjango-queryset

解决方案


推荐阅读