如何使用django的聚合功能计算具有多个约束的记录?
使用django trunk,我试图用django聚合替换复杂的数据库特定SQL语句。举个例子,假设我有一个数据库,其中包含在许多域上运行的博客表(想想看)。英国公司,每个人都有许多评论:
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子句来过滤整个shabbood:
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
?
这很重要,因为我想包括那些没有评论的博客的计数。