我知道Django 1.1有一些新的聚合方法。但是,我无法找出以下查询的等价物:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
是否可以使用Django 1.1的模型查询API,还是应该使用纯SQL?
答案 0 :(得分:60)
如果您使用的是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
中包含不需要的字段的默认排序。答案 1 :(得分:15)
Django 1.1支持像count这样的聚合方法。您可以找到the full documentation here。
要回答您的问题,您可以使用以下内容:
from django.db.models import Count
q = Player.objects.annotate(Count('games'))
print q[0]
print q[0].games__count
这需要稍微调整,具体取决于您的实际型号。
编辑:上面的代码段基于每个对象生成聚合。如果要对模型中的特定字段进行聚合,可以使用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