【问题标题】:Django: Sum on an date attribute grouped by month/yearDjango:对按月/年分组的日期属性求和
【发布时间】:2011-02-25 23:08:29
【问题描述】:

我想把这个查询从 SQL 放到 Django:

"select date_format(date, '%Y-%m') as month, sum(quantity) as hours from hourentries group by date_format(date, '%Y-%m') order by date;"

导致问题的部分是聚合时按月分组。我试过这个(这似乎合乎逻辑),但没有奏效:

HourEntries.objects.order_by("date").values("date__month").aggregate(Sum("quantity"))

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    aggregate 只能生成一个聚合值。

    您可以通过以下查询获得当月的小时总和。

    from datetime import datetime
    this_month = datetime.now().month
    HourEntries.objects.filter(date__month=this_month).aggregate(Sum("quantity"))
    

    因此,要获取 HourEntry 的所有月份的聚合值,您可以遍历数据库中所有月份的查询集。但最好使用原始 sql。

    HourEntries.objects.raw("select date_format(date, '%Y-%m') as month, sum(quantity) as hours from hourentries group by date_format(date, '%Y-%m') order by date;")
    

    【讨论】:

    • 谢谢你的回答...我的原始查询不起作用,所以我使用了你给我的 python 代码。
    • 这真的有用吗?! Specs说你必须在RAW查询中包含primary_key......“只有一个字段你不能省略 - 主键字段。Django使用主键来识别模型实例,所以它必须始终包含在原始查询。如果您忘记包含主键,则会引发 InvalidQuery 异常。 HERE/last paragraph
    【解决方案2】:

    我猜你在使用values("date__month") 后无法聚合“数量”,因为这只会在 QuerySet 中留下“日期”和“月份”。

    【讨论】:

    • 你甚至不能在参数中使用字段查找值...Field lookups
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    相关资源
    最近更新 更多