求助, django 的 group by 怎么写

2019-08-30 18:02:41 +08:00
 zqyisasd
sql:SELECT ip,COUNT(ip) as num_ip from monitor_healing_servicelog group by ip ORDER BY num_ip desc limit 10;
尝试的官方文档的写法,统计出 ip 重复出现的 top10,所有的结果都是 1
data1 = models.ServiceLog.objects.annotate(num_ip=Count("ip")).order_by("-num_ip")
----
输出 data1[0].num_ip 的结果为 1
2104 次点击
所在节点    Python
5 条回复
shanguo
2019-08-30 19:36:01 +08:00
这种需要 Count('id')
你试下这个:
models.ServiceLog.objects.annotate(num_ip=Count("id")).order_by("-num_ip")
shanguo
2019-08-30 19:38:52 +08:00
忽略上面一条
这种需要先分组 使用 values,然后 Count('id')
你试下这个:
models.ServiceLog.objects.values('num_ip').annotate(num_ip=Count("id")).order_by("-num_ip")
676529483
2019-08-30 20:00:30 +08:00
今天刚写过,有 annotate 和 distinct 的写法,但如果实在不想引入聚合函数,用 raw (我就是这么干的)
zqyisasd
2019-09-02 11:00:18 +08:00
正确用法
data1 = models.ServiceLog.objects.values("ip").annotate(num_ip=Count("ip")).order_by("-num_ip")
返回的是字典,不是 QuerySet
mathgl
2019-09-03 10:58:27 +08:00
我发现还是用 raw sql 比较好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/596617

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX