Вы можете работать противоположным образом: сначала мы фильтруем связанный Child
ren, так что у нас есть только дети, у которых foo
равен , а не 'ABC'
, а затем мы подсчитываем числоChild
жэнь.Если это ноль, мы знаем, что все эти дочерние элементы имеют 'ABC'
(включая Parent
s, у которых нет дочерних элементов).
from django.db.models import Count, Q
Parent.objects.annotate(
<b>nabc=Count('children', filter=~Q(children__foo='ABC'))</b>
).filter(
<b>nabc=0</b>
)
Это создаст запрос, который выглядит следующим образом:
SELECT parent.*,
COUNT(CASE WHEN NOT (child.foo = ABC AND child.foo IS NOT NULL)
THEN child.id ELSE NULL END) AS nabc
FROM parent LEFT OUTER JOIN child ON parent.id = child.parent_id
GROUP BY parent.id
HAVING COUNT(CASE WHEN NOT (child.foo = ABC AND child.foo IS NOT NULL)
THEN child.id ELSE NULL END) = 0