【问题标题】:Group By each date in Django 2按Django 2中的每个日期分组
【发布时间】:2018-06-26 08:20:37
【问题描述】:

我有一个名为 Log 的模型,它有一个日期时间字段 created_at

我要做的是计算每个日期的Logs 的数量。

我尝试过这样做:

from django.db.models.functions import TruncDate

Log.objects.annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))

这给了我以下信息:

{'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 1}, {'date': datetime.date(2018, 1, 17), 'count': 2}

也就是说,date 不是唯一的。

我想要的结果是这样的:

{'date': datetime.date(2018, 1, 17), 'count': 4}, {'date': datetime.date(2018, 1, 18), 'count': 2}

如何解决这个问题?

【问题讨论】:

  • @Rakesh 这是一个错误:Cannot resolve keyword 'date' into field.,如果我将其更改为 created_at,它什么也没有。
  • Log.objects.annotate(date=TruncDate('created_at')).values('d‌​ate').distinct().annotate(c=Count(‌​'id')) ?

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


【解决方案1】:

您可以使用 distinct() 方法获取 Django 中的唯一值

例如:

Log.objects.annotate(date=TruncDate('created_at')).values('d‌​‌​ate').distinct()

【讨论】:

    【解决方案2】:

    如果您在 Log 模型中设置默认排序,额外字段将添加到查询的 GROUP BY 部分,这可能会导致此问题。尝试删除排序。

    Log.objects.order_by().annotate(date=TruncDate('created_at')).values('date').annotate(c=Count('id'))
    

    【讨论】:

    • 就是这样。我查看了底层 SQL 查询,它正在向GROUP BY 添加一个附加字段。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多