我不确定 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()
with a key
函数,它采用正在分组的对象之一并提取分组应遵循的值 - 在本例中,它使用以下命令获取每行中的第二项[1]
然后调用Pythondatetime
method date()
在其上提取日期部分,不含小时和分钟。脚本的输出如下所示(pprint()
function 只是一个奇特的“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))]