1
ericls 2021-03-23 09:10:28 +08:00 via iPhone
annotate 再 values 之后 再 annotate
|
2
ericls 2021-03-23 09:10:59 +08:00 via iPhone
values 其实相当于是 group by
|
3
ericls 2021-03-23 09:31:03 +08:00 1
Order.objects.filter(create_time__lte=date).annotate(day_of_month=...).values('day_of_month').annotate(sum=Sum("amount").values('day_of_month', 'sum')
|
4
IurNusRay OP @ericls 没太看懂。。假如每天的销售额都是 100,那么我想得到的数据类似: {"2021.3.1": 100, "2021.3.2": 200, "2021.3.3": 300}, 是累加的数值而不是单日的
|
6
HelloViper 2021-03-23 09:50:19 +08:00
还不如建个新表起个 job,每次结算下前一天的持久化
|
8
SjwNo1 2021-03-23 09:59:13 +08:00
没用过 django 的 orm 哈,不过应该有 convert date 的方法,然后 group_by 即可
|
9
IurNusRay OP @HelloViper 我这个只是用在首页的一个数据统计,所以只需要看看有没有啥办法优化一下查询语句
|
10
SjwNo1 2021-03-23 10:16:30 +08:00
```
Order.objects.annotate(day=TruncDay('create_time')).values("day"). annotate(sum=Sum("amount")) .values("day", "sum") ``` |
12
lvhuiyang 2021-03-23 10:41:40 +08:00
如果 ORM 中没有针对于当前特定业务的实现的话,手动处理下也不繁琐。大概想到两种方式:
- 1. 帖子开头描述的遍历一个月的所有日期,进行 30 次左右的 query 。 - 2. 上面用 annotate 一个 query 语句按照 day of month 进行 group by 查询出每天的销售额,然后用 Python 进行逻辑上的累加。 ```python In [9]: from collections import OrderedDict In [10]: od = OrderedDict([('2020-01-01', 10), ('2020-01-02', 12), ('2020-01-03', 15)]) In [11]: pre_value = 0 ...: result = OrderedDict() ...: for k, v in od.items(): ...: pre_value += v ...: result[k] = pre_value ...: In [12]: result Out[12]: OrderedDict([('2020-01-01', 10), ('2020-01-02', 22), ('2020-01-03', 37)]) ``` 对比第 1 种多次查询带来的开销,第 2 种的 Python 累加的开销可以忽略不计,要我我选第 2 种实现。 |
14
lvhuiyang 2021-03-23 10:47:40 +08:00
|