0

如何使用 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这很重要,因为我想计算那些没有评论的博客。

4

1 回答 1

0

我不知道如何使用 Django 查询语言来执行此操作,但您始终可以运行原始 SQL 查询。如果你还不知道怎么做,这里有一个例子:

from django.db import connection

def some_method(request, some_parameter):
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM table WHERE somevar=%s', [some_parameter])
    rows = cursor.fetchall()

在线 Django 书籍中提供了更多详细信息:http: //www.djangobook.com/en/2.0/chapter05/

查找“在视图中进行数据库查询的“愚蠢”方式”部分。如果您不想使用“愚蠢”的方式,我不确定您的选择是什么。

于 2009-07-18T14:30:01.857 回答