【问题标题】:Django querying data out of models and get sum of fieldDjango 从模型中查询数据并获取字段总和
【发布时间】:2021-11-13 14:09:57
【问题描述】:

我刚开始使用 Django 并有以下问题: 我已经建立了一个看起来像的模型

class Automation_Apps(models.Model):
    app_name = models.CharField(max_length=50)
    app_description = models.TextField(blank=True)
    view_function_name = models.CharField(max_length=50)
    time_saver_min = models.IntegerField()
    implementation_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.app_name

class Automation_Usage(models.Model):
    used_app = models.ForeignKey(Automation_Apps, on_delete=models.CASCADE)
    used_by_user = models.ForeignKey(User, on_delete=models.CASCADE)
    used_on_date = models.DateTimeField(auto_now_add=True)

我想这样查询:

Select Sum(time_saver_min)
from Automation_Apps, Automation_Usage
where Automation_Usage.used_app = Automation_Apps.app_name

这样做的目标如下: Automation_App会有Apps和一个字段,使用这个app能节省多少时间

Automation_Usage 将在用户使用该应用程序时拥有记录。

通过我的查询,我想提取应用程序的使用频率以及使用它节省了多少时间(来自Automation_App)。

在我看来,我想这样做。

【问题讨论】:

  • 查询的目标是什么?我想,您想获得特定 app_nametime_saver_min 总和,但不确定为什么要包含其他模型?
  • 查询的目标:我想收集有多少用户使用了这个应用程序。这在 Automation_Usage 中。但我想节省时间。此信息位于 Automation_Apps 中。结果应该给我所有使用的应用程序的时间总和。这有意义吗?
  • 对!所以你想得到每个用户在所有应用程序上使用的时间总和?我已添加答案,请查看。
  • 看来,您还需要每个应用程序的用户数。我在答案中添加了两个选项。

标签: python django model


【解决方案1】:

您可以使用模型总和来对模型的值求和。

这样做;

from django.db.models import Sum 那么

data = Model.objects.aggregate(Sum('time_saver_min'))['time_saver_min__sum'] print(data)

【讨论】:

  • 这是增加 Automation_Apps 的超时时间。但我想将 Automation_Usage 中的条目与 Automation_Apps 中的 time_saver_min 值相加。我想注册使用情况。对于应用程序的每次使用,我都会从 Automation_Apps 中获得节省的分钟数,我想总结一下,就像上面的 SQL 中描述的那样。示例:我在 Automation_Usage 中有 3 个条目。应用程序 1 为 2,应用程序 2 为 1 在 Automation_Apps 中,应用程序 1 = 5 分钟和应用程序 2 = 10 分钟的字段 time_saver_min 总和的结果应为 20 分钟。
【解决方案2】:

您可以在 Django ORM 中使用注释。

我的解决方案:

Sum(time_saver_min) 基于 Automation_Usage.used_app = Automation_Apps.app_name

=> queryset = Automation_Usage.objects.values('used_app').annotate(Coalesce(Sum('used_app__time_saver_min'), Value(0)))

=> 打印(查询集['used_app__time_saver_min__sum'])

【讨论】:

  • 无法运行:“Coalesce”对象没有“过滤器”属性
  • @OliverDemus 我被编辑了,请检查!
【解决方案3】:

要获得每个用户在所有应用上使用的时间总和:

from django.db.models import Sum
Automation_Usage.objects.values('used_by_user').annotate(time=Sum('used_app__time_saver_min'))

要获取每个应用程序使用的用户数量和时间总和:

from django.db.models import Sum, Count
Automation_Usage.objects.values('used_app').annotate(users=Count('used_by_user'), time=Sum('used_app__time_saver_min'))

【讨论】:

  • 就是这样!非常感谢您的支持!
猜你喜欢
  • 2016-08-11
  • 2011-04-11
  • 1970-01-01
  • 2016-12-18
  • 2020-07-07
  • 1970-01-01
  • 2020-10-20
  • 2018-12-08
  • 1970-01-01
相关资源
最近更新 更多