【问题标题】:Django equivalent of COUNT with GROUP BYDjango 相当于 COUNT 和 GROUP BY
【发布时间】:2010-10-24 22:19:26
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

如果您使用的是 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 中的默认排序。

【讨论】:

    【解决方案2】:

    Django 1.1 确实支持计数等聚合方法。你可以找到the full documentation here

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

    from django.db.models import Count
    q = Player.objects.annotate(Count('games'))
    print q[0]
    print q[0].games__count
    

    这需要根据您的实际型号稍作调整。

    编辑:上面的 sn-p 在每个对象的基础上生成聚合。如果要对模型中的特定字段进行聚合,可以使用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
    

    【讨论】:

    • 此调用将产生错误的GROUP BY 子句 - 包括所有模型字段。但是作者只问了一个字段分组。
    • 我试图给出一个通用示例并指向文档。这就是为什么我说我的 sn-p 需要调整的原因。我现在在我的答案中添加了更多示例。感谢您的评论。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2020-05-11
    • 2019-04-26
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多