В Django, как я могу запросить, чтобы все связанные объекты имели одинаковое значение для определенного поля? - PullRequest
1 голос
/ 19 сентября 2019

Допустим, у меня есть следующие модели в Django:

    class Parent(models.Model):
        pass

    class Child(models.Model):
        parent = models.ForeignKey(Parent, related_name='children', null=True)
        foo = models.CharField(max_length=5, blank=True, null=True)

Как мне запросить модель Parent, чтобы найти все записи Parent, где ВСЕ ее children имеют значение 'ABC 'для foo?

Если я запускаю: Parent.objects.filter(children__foo='ABC'), он возвращает Parent объектов, где хотя бы один из его children имеет значение' ABC 'для foo, чтоне то, что я хочу.Спасибо за любую помощь, спасибо.

1 Ответ

1 голос
/ 19 сентября 2019

Вы можете работать противоположным образом: сначала мы фильтруем связанный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...