【问题标题】:Grouping queryset by date按日期分组查询集
【发布时间】:2019-04-03 21:39:44
【问题描述】:

我有一个包含日期和其他字段的类。

我要弄清楚的是一个查询,它将返回我每个项目,按日期分组。

所以,给定以下类:-

class Item(models.Model):
    item_date = models.DateField()
    <other fields>

我想要这样的东西:-

[
    {
        'item_date': datetime.date(2018, 9, 12),
        'items': <Queryset [<Item: item1>, <Item: item17> ...]
    }, {
        'item_date': datetime.date(2018, 9, 13),
        'items': <Queryset [<Item: item2>, <Item: item33> ...]
    }, {
        'item_date': datetime.date(2018, 9, 14),
        'items': <Queryset [<Item: item34>, <Item: item37> ...]
    } ...
]

我很确定我需要某种注释,但我不能 100% 确定如何构建它。

我得到的最接近的是:-

Item.objects.values('item_date').annotate(Count('id')).order_by('item_date')

但这只是给了我每个日期有多少项目的计数 - 而不是实际项目(显然!)。

我需要什么来代替那个伯爵?这甚至可能吗?!

【问题讨论】:

    标签: django django-annotate


    【解决方案1】:

    大多数(如果不是全部)SQL 数据库不能返回 分层 数据,或者至少在没有大量 trics 的情况下不能返回。您应该在 Django 级别进行排序,例如使用itertools.groupby [Python-doc]:

    from itertools import groupby
    from operator import attrgetter
    
    result = [
        {'item_date': k, 'items': list(vs)}
        for k, vs in groupby(
            Item.objects.all().order_by('item_date'),
            attrgetter('item_date')
        )
    ]
    

    通常开销不会那么大,因为反序列化对象已经花费了线性时间,而 itertools.groupby 也需要线性时间。

    .order_by(..) 的键功能很重要,因为.groupby(..) 在分组之前不会首先查看所有对象:它会将具有相同键值的元素的“子序列”分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2020-03-31
      • 2013-08-14
      • 1970-01-01
      • 2022-01-23
      • 2021-01-15
      • 2013-12-08
      相关资源
      最近更新 更多