You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:55:10