我不确定 Django 的 ORM 是否可以在查询中间执行日期时间到日期的转换。不过,您可以先进行查询,获取结果,然后使用 Python groupby() 函数对返回的行进行排序。下面是一个按日期分组日期时间的小例子:
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],然后在其上调用Python datetime 方法date() 以提取没有小时和分钟的日期部分。脚本的输出看起来像这样(pprint() 函数只是一个花哨的“打印”语句,用于缩进输出,在您的 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))]