小编典典

Django聚合:两个字段相乘的总和

django

我有一个类似这样的模型:

class Task(models.Model):
    progress = models.PositiveIntegerField()
    estimated_days = models.PositiveIntegerField()

现在,我想Sum(progress * estimated_days)在数据库级别进行计算。使用Django聚合,我可以获取每个字段的总和,但是不能获取字段相乘的总和。


阅读 1335

收藏
2020-03-26

共2个答案

小编典典

对于Django> = 1.8,请遵循@kmmbvnr提供的答案

可以使用Django ORM:

这是你应该做的:

from django.db.models import Sum

total = ( Task.objects
            .filter(your-filter-here)
            .aggregate(
                total=Sum('progress', field="progress*estimated_days")
             )['total']
         )

注意:如果两个字段的类型不同,例如integerfloat,则应将要返回的类型作为的第一个参数传递Sum

这是一个很晚的答案,但我想它会帮助某人寻找相同的东西。

2020-03-26
小编典典

使用Django 1.8及更高版本,您现在可以将表达式传递给聚合:

 from django.db.models import F

 Task.objects.aggregate(total=Sum(F('progress') * F('estimated_days')))['total']

常量也可用,并且所有内容都可以组合:

 from django.db.models import Value

 Task.objects.aggregate(total=Sum('progress') / Value(10))['total']
2020-03-26