我有一个包含日期和其他一些字段的类。
我要弄清楚的是一个查询,该查询将按日期将每个项目返回给我。
因此,给定以下类别:-
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')
但这只是给我每个日期有多少个项目的计数-而不是实际的项目(显然!)。
除了计数之外,我还需要什么?这有可能吗?!
答案 0 :(得分:0)
大多数(如果不是全部)SQL SQL数据库不能返回分层数据,或者至少没有很多度量标准。您应该在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(..)
不会在分组之前首先查看所有对象:它将具有相同键值的元素的“子序列”分组。