Django цепочка фильтров дочерних объектов

У меня есть модели Parent и Child и я пытаюсь отфильтровать в цепочке дочерние объекты по условию

objects = Parent.objects.all()

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

Если я делаю цепочку дочерних фильтров, Django делает несколько JOIN с отдельными WHERE. Что-то вроде этого:

    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)

Выглядит плохо. Есть ли лучший подход для фильтрации дочерних объектов по условию?

Вернуться на верх