Django-仅按日期部分分组

问题描述

我不确定Django的ORM是否可以在查询中间将日期时间转换为日期。但是,您可以先执行查询获取结果,然后使用Pythongroupby()函数对返回的行进行排序。这是一个按日期对日期时间进行分组的小示例:

from pprint import pprint
from datetime import datetime
from itertools import groupby

rows = [('Frodo party', datetime(3018, 9, 22, 10, 38)),
        ('Nazgul defeat Rangers', datetime(3018, 9, 22, 11, 57)),
        ('Frodo finishes packing', datetime(3018, 9, 23, 10, 59)),
        ('Gandalf tames Shadowfax', datetime(3018, 9, 23, 13, 11)),
        ('Gandalf crosses the Isen', datetime(3018, 9, 24, 18, 46))]

for key, values in groupby(rows, key=lambda row: row[1].date()):
    print('-')
    pprint(key)
    pprint(list(values))

如您所见,您必须提供groupby()一个key函数,该函数接受要分组的对象之一,并提取应该进行分组的值–在这种情况下,它使用并抓取每行中的第二项[1],然后调用它的Pythondatetime方法date()提取日期部分,而不需要小时和分钟。脚本的输出看起来像这样(该pprint()函数只是一个花哨的“ print”语句,它使输出缩进,在您的Django代码中将不需要它!):

-
datetime.date(3018, 9, 22)
[('Frodo party', datetime.datetime(3018, 9, 22, 10, 38)),
 ('Nazgul defeat Rangers', datetime.datetime(3018, 9, 22, 11, 57))]
-
datetime.date(3018, 9, 23)
[('Frodo finishes packing', datetime.datetime(3018, 9, 23, 10, 59)),
 ('Gandalf tames Shadowfax', datetime.datetime(3018, 9, 23, 13, 11))]
-
datetime.date(3018, 9, 24)
[('Gandalf crosses the Isen', datetime.datetime(3018, 9, 24, 18, 46))]

解决方法

MyModel.objects.filter(created_at__gte='2011-03-09',created_at__lte='2011-03-11').values('created_at','status').annotate(status_count=Count('status'))

上面的查询有created_atdatetime字段的问题。在执行分组依据时,是否可以对上述查询进行调整以忽略时间值并仅使用日期值?