【问题标题】:Django annotate Multiple Sum and group ByDjango 注释 Multiple Sum 和 group By
【发布时间】:2021-10-23 14:32:12
【问题描述】:

让我们采用这个模型:

class Server(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False)
    cpu = models.PositiveIntegerField(null=False, blank=False)
    ram = models.PositiveBigIntegerField(null=False, blank=False)
    customer = models.ForeignKey(
    Customer,
    related_name='Servers',
    on_delete=models.SET_NULL,
    null=True,
    blank=True
    )
    city = models.ForeignKey(
    City,
    related_name='Servers',
    on_delete=models.CASCADE,
    null=True,
    blank=True
    )


class Disk(models.Model):
    server = models.ForeignKey(
        Server,
        related_name='Disks',
        on_delete=models.CASCADE,
        null=False,
        blank=False
    )
    size = models.PositiveBigIntegerField(null=False, blank=False)


class Customer(models.Model):
    name = models.CharField(max_length=255,
                            blank=True, null=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    enabled = models.BooleanField(
        blank=False, null=False, default=False)

class City(models.Model):
    name = models.CharField(max_length=255,
                            blank=False, null=False)
    country = models.ForeignKey(
        Country,
        related_name='Cities',
        on_delete=models.CASCADE,
        null=False,
        blank=False
    )
class Country(models.Model):
    name = models.CharField(max_length=255,
                            blank=False, null=False)

我想知道每个国家/地区每个客户的每个 CPU、RAM、磁盘空间的总和有多少台服务器。

  • 每个服务器都有一个城市,每个城市都在一个国家/地区。
  • 一些服务器还没有客户,但我仍然需要知道有多少服务器、CPU、...我没有客户(最终可以创建一个“未知”客户,以便不在服务器中将其设置为无)。 /li>

任何帮助将不胜感激!谢谢!!

【问题讨论】:

    标签: django postgresql django-models


    【解决方案1】:

    我不确定是否可以提供帮助,因为我认为没有测试就太实验性了。

    例如,标注国家和服务器数量:

    Server.objects.annotate(get_country=F("city__country")).values("get_country").annotate(count=Count('get_country'))
    

    现在从这里开始,如果您的结果类似于 [{"countryA":150, "countryB": 17, ....}] 您可以继续并将计数替换为

    Server.objects.annotate(get_country=F("city__country")).values("get_country").annotate(sum_cpu=Sum('cpu'), sum_ram=Sum('ram'), sum_disk=Sum('disk__size'))
    

    现在,由于您希望这是针对每个客户的,因此您必须重新格式化它以从客户模型而不是服务器模型开始。

    或者取决于您如何显示您的查询可以开始的数据 Server.objects.filter(customer=customer_obj).annotate....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2020-01-19
      • 1970-01-01
      • 2017-08-17
      • 2021-01-30
      相关资源
      最近更新 更多