Django + PostgreSQL按日期在datetimefield上分组

时间:2012-04-18 06:32:42

标签: django django-models

我有一个模型,其中有一个datetimefield,我试图按日期分组注释。

例如:

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'))

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您应该可以使用QuerySet.extra解决此问题,并在查询中添加一列

例如

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

答案 1 :(得分:1)

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