【问题标题】:Django + PostgreSQL group by date on datetimefieldDjango + PostgreSQL 在 datetimefield 上按日期分组
【发布时间】:2023-03-18 21:54:01
【问题描述】:

我有一个模型,它有一个日期时间字段,我试图在按日期分组时对其进行注释。

例如:

order_totals = Transfer.objects.filter(created__range=[datetime.datetime.combine(datetime.date.today(), datetime.time.min) + datetime.timedelta(days=-5), datetime.datetime.combine(datetime.date.today(), datetime.time.max)]).values('created').annotate(Count('id'))

上面的问题是它按日期时间字段的每秒/毫秒分组,而不仅仅是日期。

我该怎么做?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您应该能够通过使用 QuerySet.extra 并在查询中添加一列来解决此问题

    例如。

    qs.filter(...).extra(select={'created_date': 'created::date'}).values('created_date')
    

    【讨论】:

      【解决方案2】:

      Django 1.8 开始,您还可以使用新的DateTime expression(奇怪的是它没有记录在built-in expressions 表中)。

      import pytz
      from django.db.models.expressions import DateTime
      
      qs.annotate(created_date=DateTime('created', 'day', pytz.UTC))
      

      如果您想按created_date 分组,只需链接另一个聚合表达式:

      qs.annotate(created_date=DateTime('created', 'day', pytz.UTC)).values('created_date').annotate(number=Count('id'))
      

      (需要冗余values 来生成适当的GROUP BY。请参阅Django 文档中的aggregation topic)。

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2023-03-10
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        相关资源
        最近更新 更多