【问题标题】:Django SUM from INNER JOIN来自 INNER JOIN 的 Django SUM
【发布时间】:2018-06-12 00:30:51
【问题描述】:

我有一个这样的数据库:

class MyCPU(models.Model):
    cpu_name = models.CharField(max_length=100)
    cpu_count = models.IntegerField()


class MyMachine(models.Model):
    hostname = models.CharField(max_length=50)
    ip = models.CharField(max_length=50)
    cpu = models.ForeignKey(CPU, on_delete=models.CASCADE)

如何在 Django 中实现以下原始 SQL 命令的结果?

select sum(cpu_count) as sum_cpu from my_machine inner join my_cpu on my_machine.cpu_id=my_cpu.id

我基本上想总结所有机器中有多少 CPU。

我已经尝试过这个解决方案,但它不起作用

Machine.objects.annotate(total_cpu=Sum('cpu__cpu_count'))

【问题讨论】:

  • 没用是什么意思?有什么错误吗?
  • 我期望一个整数,目的是总结所有机器中有多少 CPU。但它返回一个查询集
  • 然后执行queryset.values()。然后你会得到 dict 的结果。
  • JOIN 的意义何在?如果你想要一个单一的值,为什么不MyCPU.objects.aggregate(total_cpu=Sum('cpu_count'))
  • 我的意思是所有机器中有多少 CPU。我们需要从机器表和 CPU 表中选择

标签: django sum inner-join


【解决方案1】:

由于您使用的是外键,所以您可以这样做

MyMachine.objects.values('hostname', 'ip', 'cpu__cpu_count')

这会得到每台机器多少个cpu`s。

如果你需要cpu的总数

MyCPU.objects.aggregate(total_cpu=Sum('cpu_count'))['total_cpu']

如果有未连接的 CPU 对象,您可以执行以下操作从所有机器获取总和,

MyMachine.objects.aggregate(total_cpu=Sum('cpu__cpu_count'))['total_cpu']

我认为最后一个是您正在搜索的,因为在不同的机器上可能存在相同的 CPU 对象。

【讨论】:

  • 然后我们如何对它们求和?不是写一个 for 循环
  • 更新答案以获得cpu的总数
  • 是的。最后一个应该几乎正确。但是,它使用原始 SQL 返回的结果略有不同。你能指导我到底发生了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2021-11-21
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多