Django 相当于 COUNT 和 GROUP BY

Posted

技术标签:

【中文标题】Django 相当于 COUNT 和 GROUP BY【英文标题】:Django equivalent of COUNT with GROUP BY 【发布时间】:2010-10-24 22:19:26 【问题描述】:

我知道 Django 1.1 有一些新的聚合方法。但是我无法弄清楚以下查询的等价物:

SELECT player_type, COUNT(*) FROM players GROUP BY player_type;

是否可以使用 Django 1.1 的模型查询 API 或者我应该只使用普通 SQL?

【问题讨论】:

Django: how to do SELECT COUNT(*) GROUP BY and ORDER BY的可能重复 【参考方案1】:

如果您使用的是 Django 1.1 beta(主干):

Player.objects.values('player_type').order_by().annotate(Count('player_type'))
values('player_type') - 仅用于将 player_type 字段包含到 GROUP BY 子句中。 order_by() - 用于排除可能导致不需要的字段包含在 SELECTGROUP BY 中的默认排序。

【讨论】:

【参考方案2】:

Django 1.1 确实支持计数等聚合方法。你可以找到the full documentation here。

要回答您的问题,您可以使用以下内容:

from django.db.models import Count
q = Player.objects.annotate(Count('games'))
print q[0]
print q[0].games__count

这需要根据您的实际型号稍作调整。

编辑:上面的 sn-p 在每个对象的基础上生成聚合。如果要对模型中的特定字段进行聚合,可以使用values 方法:

from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('games')).order_by()
print q[0]
print q[0].games__count

order_by() 是必需的,因为默认排序的字段会被自动选择,即使它们没有显式传递给values()。对order_by() 的调用将清除所有排序并使查询按预期运行。

另外,如果要统计用于分组的字段(相当于COUNT(*)),可以使用:

from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('playertype')).order_by()
print q[0]
print q[0].playertype__count

【讨论】:

此调用将产生错误的GROUP BY 子句 - 包括所有模型字段。但是作者只问了一个字段分组。 我试图给出一个通用示例并指向文档。这就是为什么我说我的 sn-p 需要调整的原因。我现在在我的答案中添加了更多示例。感谢您的评论。 :)

以上是关于Django 相当于 COUNT 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

Django- Group by 和 Count by unique together

在 Django 中使用带有 GROUP BY 子句的 COUNT(DISTINCT 字段)

如何选择 COUNT(*) GROUP BY DJANGO? [复制]

MongoDB 相当于 SQL COUNT GROUP BY

Django 做一个简单的 group by/count 语句

如何在 Django ORM 中执行 GROUP BY ... COUNT 或 SUM?