Django聚合:两个字段的乘法求和

Rau*_*wal 48 python django django-models django-orm django-queryset

我有一个这样的模型

class Task(models.Model):
    progress = models.PositiveIntegerField()
    estimated_days = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

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

sha*_*256 71

更新:对于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']
         )
Run Code Online (Sandbox Code Playgroud)

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

这是一个迟到的答案,但我想它会帮助有人寻找同样的东西.

  • 效果很好,谢谢,但要注意 *field* kwarg 没有记录在案,而且我在 Django 测试套件中没有找到任何关于它的测试。 (2认同)

kmm*_*vnr 69

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

 from django.db.models import F

 Task.objects.aggregate(total=Sum(F('progress') * F('estimated_days')))['total']
Run Code Online (Sandbox Code Playgroud)

常量也可用,一切都可以组合:

 from django.db.models import Value

 Task.objects.aggregate(total=Sum('progress') / Value(10))['total']
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案更容易理解和维护.除了这些字段的类型不同之外,还要将`output_field`参数添加到聚合函数中 (6认同)
  • 这是目前正确的答案.谢谢 (4认同)

小智 27

解决方案取决于Django版本.