Django - 仅由日期部分组成

Siv*_*lam 9 python django django-models django-queryset

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

上面的查询有created_atdatetime字段的问题.是否可以调整上述查询以忽略时间值并在执行group by时单独使用日期值?

Bra*_*des 11

我不确定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))
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您必须提供groupby()一个key函数,该函数接收它正在分组的对象之一并提取应该进行分组的值 - 在这种情况下,它会抓取每行中的第二个项目[1]然后调用它上面的Python datetime方法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))]
Run Code Online (Sandbox Code Playgroud)


bra*_*enm 6

我对这个问题来说太迟了,但是为了将来的参考,我想指出这实际上可以使用原生Django,如/sf/answers/159873941/所述.