用GROUP BY计算的Django等价数

2024-03-29 14:43:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Django1.1的模型查询API是否可以,或者我应该只使用普通的SQL?


Tags: django方法from模型apisqlbytype
2条回答

如果您使用的是Django 1.1 beta(trunk):

Player.objects.values('player_type').order_by().annotate(Count('player_type'))
  • values('player_type')-仅用于将player_type字段包含到GROUP BY子句中。
  • order_by()-排除可能导致不需要的字段包含在SELECTGROUP BY中的默认顺序。

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

相关问题 更多 >