33

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

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

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

4

2 回答 2

64

如果您使用的是 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
于 2009-05-09T07:40:12.897 回答
16

Django 1.1 确实支持计数等聚合方法。您可以在此处找到完整的文档

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

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
于 2009-05-08T22:25:40.920 回答