如何使用 django 的聚合功能计算具有多个约束的记录?
使用 django 主干,我试图用 django 聚合替换复杂的数据库特定 SQL 语句。例如,假设我有一个数据库,其中包含在许多域(想想 .co.uk、.com、.etc)上运行的博客的表,每个都有许多评论:
domains <- blog -> comment
以下 SQL 对每个域的评论进行计数:
SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id
GROUP BY D.id
这很容易复制:
Domain.objects.annotate(Count('blogs__comments'))
更进一步,我希望能够添加一个或多个约束并复制以下 SQL:
SELECT D.id, COUNT(O.id) as CommentCount FROM domain AS D
LEFT OUTER JOIN blog AS B ON D.blog_id = B.id
LEFT OUTER JOIN comment AS C ON B.id = C.blog_id
AND C.active = True
GROUP BY D.id
这更难以复制,因为 django 似乎包括使用 WHERE 子句过滤整个 shaboodle:
Domain.objects.filter(blogs__comments__active=True)
.annotate(Count('blogs__comments'))
SQL 出来的东西是这样的:
SELECT ..., COUNT(comment.id) AS blog__comments__count FROM domain
LEFT OUTER JOIN blog ON domain.blog_id = blog.id
LEFT OUTER JOIN comment ON blog.id = comment.blog_id
WHERE comment.active = True
GROUP BY domain.id
ORDER BY NULL
我怎样才能说服 django 弹出适当的额外约束LEFT OUTER JOIN
?这很重要,因为我想计算那些没有评论的博客。