如何在Django中实现INNER JOIN关联下的CPU总数求和?
解决Django中统计所有机器CPU总数量的问题
嘿,我来帮你搞定这个统计需求!首先提个小细节:你的MyMachine模型里的外键写的是CPU,但实际你的CPU模型是MyCPU,这个得先修正,不然运行会报错,修正后的模型应该是这样:
class MyMachine(models.Model): hostname = models.CharField(max_length=50) ip = models.CharField(max_length=50) cpu = models.ForeignKey(MyCPU, on_delete=models.CASCADE) # 把CPU改为MyCPU
接下来说说你之前用annotate没成功的原因:annotate是给每个查询对象添加一个聚合字段,比如给每台机器加一个对应的CPU数量注释,但你要的是所有机器的CPU总数量,这时候应该用aggregate方法,它是对整个查询集做全局聚合。
正确的ORM实现方式
用aggregate结合Sum来实现你的原生SQL效果,代码如下:
from django.db.models import Sum # 统计所有机器关联的CPU总数量 total_cpu = MyMachine.objects.aggregate(total_sum=Sum('cpu__cpu_count'))['total_sum'] or 0
解释一下:
cpu__cpu_count是Django ORM的跨表关联写法,意思是通过MyMachine的cpu外键关联到MyCPU,然后取它的cpu_count字段aggregate会返回一个字典,比如{'total_sum': 100},我们通过['total_sum']取出数值;如果没有数据的话结果会是None,所以用or 0转成0更友好
如果你想用原生SQL实现
也可以直接执行你给出的原生SQL,Django提供了原生SQL执行的方式:
from django.db import connection with connection.cursor() as cursor: cursor.execute(""" SELECT SUM(cpu_count) AS sum_cpu FROM my_machine INNER JOIN my_cpu ON my_machine.cpu_id = my_cpu.id """) result = cursor.fetchone() total_cpu = result[0] if result else 0
这样就能得到和你原生SQL完全一样的统计结果啦!
内容的提问来源于stack exchange,提问作者AlexPham
相关产品推荐
相关产品推荐

