Django-仅按日期部分分组

发布于 2021-01-29 15:58:32

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

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我不确定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))]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看