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)
Выглядит плохо. Есть ли лучший подход для фильтрации дочерних объектов по условию?