model 结构是 id,add_date,car_id,service_item car_id 是外键。
Service.objects.annotate(car_count=Count('car_id')) 想按 car_id 进行分组统计,但结果是一条记录一行。似乎是受日期字段的影响。 纯 sql 好解决,在 model 的范围内,怎么处理?
1
746970179 2018-06-27 17:21:13 +08:00
如果是想统计每个 car_id 有多少个 service, 即按照 car_id 进行 group by
那么 Service.objects.values('car_id').annotate(car_count=Count('car_id')) 即可 你可以在每条 queryset 后面, 用.query 看对应 queryset 的 sql 语句 Service.objects.values('car_id').annotate(car_count=Count('car_id')).query 大致就是 select car_id, count('car_id') from service group by car_id. |
2
hunk OP 这样的结果是正确的,只是未能选出其它字段,如 service_item 和 add_date,如何同时选出统计结果和其它字段?
|
3
hunk OP values 中一旦添加其它字段,统计结果就为 1,完全没分组。
model 感觉不如 sql 来的直接。 |
4
aixia0124 2018-06-27 18:16:24 +08:00
分组聚类计算用 annotate,如果你的 model.META 里定义了 ordering 属性,需要在 annotate 之后 order_by()一下。
应该就不会出现你说的聚类受日期影响了 |
5
746970179 2018-06-27 18:40:51 +08:00
car_id 和 service 是一对多的关系, 所以你取出来的时候, 到底取哪个 add_date 呢?
values 里的字段, 在这里是 group by 里的字段. group by 多个字段, 自然数量大多是 1 了. |
6
hunk OP @746970179 是否是说,不能同时取出表内其它字段和统计结果,只能取到聚合字段和统计值?
先取出字段信息,再计算统计结果,如何进行关联并显示呢? |
7
thread2 2018-06-27 19:29:50 +08:00
“纯 sql 好解决”,“ model 感觉不如 sql 来的直接”,你想要的 SQL 怎么写的?
|
8
tomczhen 2018-06-27 19:43:10 +08:00 via Android
1 .用物化(索引)视图实现,模型绑定视图。
2. 通过模型获取需要的数据,应用内分组汇总。 |
9
xpresslink 2018-06-27 23:12:14 +08:00
楼主注意,annotate 有个坑
如果你的 Model 定义了默认排序字段, 必须要加 order_by() Service.objects.values('car_id').annotate(car_count=Count('car_id')).order_by() |
10
georgema1982 2018-06-28 02:23:19 +08:00
@xpresslink 这个不是 django 的 order by 的坑,而是数据库的坑。如果数据库遵守 sql 标准的话就存在这个所谓的“坑”(其实不是坑,而是标准),如果是 mysql 的话就会放你一马
|
11
hunk OP 谢谢楼上二位,问题是我没在 model 中加 order_by,稍后再研究下 annotate。
现在在 model 定义了函数,返回 count。每一行一个二次查询。不雅,总算能解决问题。 跨表统计这种情况,还是要小心研究下,以后只会多不会少。mongodb 中似乎也不方便。还是老老实实 mysql 吧。 |