Django与GROUP BY相当于COUNT

时间:2009-05-08 22:08:33

标签: python sql django django-queryset django-aggregation

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

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

是否可以使用Django 1.1的模型查询API,还是应该使用纯SQL?

2 个答案:

答案 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() - 用于排除可能导致SELECTGROUP 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