django - 按日期分组查询集
问题描述
我有一个包含日期以及其他一些字段的类。
我想弄清楚的是一个查询,它将返回我每个项目,按日期分组。
因此,给定以下课程:-
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数据库不能返回分层数据,或者至少不能没有很多技巧。您应该在 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(..)
对 key 函数很重要,因为.groupby(..)
在分组之前不会首先查看所有对象:它将具有相同键值的元素的“子序列”分组。
推荐阅读
- python - 使用带有两个自变量的 curve_fit 将函数拟合到实验数据
- hive - 向时间戳 Hive 添加分钟
- python - 如何多次重复 .index 搜索
- c - 32536 总线错误 ./program,由于我使用了 recv?
- c - 使用 for 循环检查数组中的元素以确保它们是正确的数据类型,但答案是打印太多次
- javascript - Firebase 函数
- mysql - 远程连接到 Linode mysql 服务器
- python - 如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?
- javascript - 如何从这段代码开始使用 Javascript 找到这个方程的定积分?
- c# - 创建一个 Windows 服务来杀死从 IE 11 等 Web 浏览器登录的程序,该程序在 30 分钟后处于空闲或未使用状态