微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django-仅按日期部分分组

如何解决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字段的问题。在执行分组依据时,是否可以对上述查询进行调整以忽略时间值并仅使用日期值?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。