在 Django 中,如何查询所有相关对象的某个字段具有相同的值?

use*_*013 5 sql django django-models

假设我在 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)
Run Code Online (Sandbox Code Playgroud)

我将如何查询Parent模型以查找所有Parent记录children的值为“ABC” foo

如果我运行: Parent.objects.filter(children__foo='ABC'),它会返回Parent至少其中一个对象children的值为 'ABC' 的对象foo,这不是我想要的。如有任何帮助,我们将不胜感激,谢谢。

Wil*_*sem 5

你可以以相反的方式工作:我们首先过滤相关的Children ,这样我们只有不是 的孩子foo然后 'ABC'我们计算 ren 的数量Child。如果为零,我们就知道所有这些孩子都有'ABC'(这包括Parent没有孩子的 s)。

from django.db.models import Count, Q

Parent.objects.annotate(
    nabc=Count('children', filter=~Q(children__foo='ABC'))
).filter(
    nabc=0
)
Run Code Online (Sandbox Code Playgroud)

这将生成一个如下所示的查询:

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
Run Code Online (Sandbox Code Playgroud)