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,这不是我想要的。如有任何帮助,我们将不胜感激,谢谢。
你可以以相反的方式工作:我们首先过滤相关的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)
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |