Вы можете аннотировать количество Child
с и затем фильтровать по этому номеру, например:
from django.db.models import Count
Parent.objects.annotate(
<b>nchild=Count('child')</b>
).filter(<b>nchild__gt=1</b>)
. Это сгенерирует запрос типа:
SELECT parent.*, COUNT(child.id) AS nchild
FROM parent
LEFT OUTER JOIN child ON parent.id = child.parent_id
GROUP BY parent.id
<b>HAVING COUNT(child.id) > 1</b>
Можноизмените условие .filter(..)
на всевозможные условия по количеству дочерних элементов nchilds
, например nchild=4
фильтры на Parent
s с ровно четырьмя дочерними элементами, тогда как ~Q(nchild=7)
исключит все Parent
s с ровно семьюдети.Таким образом, мы можем создавать более сложные фильтры.