按日期分组查询集

Grouping queryset by date

我有一个 class,其中包含一个日期以及一些其他字段。

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

因此,给定以下 class:-

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')

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

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

大多数(如果不是全部)SQL 数据库不能 return 分层 数据,或者至少并非没有很多技巧。您应该在 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(..) 在分组之前不会首先查看所有对象:它将 "subsequences" 具有相同键值的元素分组。