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()
- 用于排除可能导致不需要的字段包含在 SELECT
和 GROUP 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