我知道 Django 1.1 有一些新的聚合方法。但是我无法弄清楚以下查询的等价物:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
是否可以使用 Django 1.1 的模型查询 API 或者我应该只使用普通 SQL?
我知道 Django 1.1 有一些新的聚合方法。但是我无法弄清楚以下查询的等价物:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
是否可以使用 Django 1.1 的模型查询 API 或者我应该只使用普通 SQL?
如果您使用的是 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
。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