Django聚合:两个域的乘法求和

我有一个这样的模型

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

现在我想在数据库级别上进行计算Sum(progress * estimated_days) 。 使用Django聚合我可以有每个领域的总和,但不是领域的乘法的总和。

更新:对于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'] ) 

注意:如果两个字段是不同的types,比如说integerfloat ,那么你想返回的types应该作为Sum的第一个参数

这是一个迟到的答案,但我想它会帮助别人寻找相同的。

使用Django 1.8或更高版本,您现在可以将expression式传递给您的聚合:

  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'] 

解决scheme取决于Django版本。

  • django <1.8

     from django.db.models import Sum MyModel.objects.filter(<filters>).aggregate(Sum('field1', field="field1*field2")) 
  • django> = 1.8

     from django.db.models import Sum, F MyModel.objects.filter(<filters>).aggregate(Sum(F('field1')*F('field2'))) 

你有几个select:

  1. 原始查询
  2. Emulbreh的无证方法
  3. 创build第三个字段progress_X_estimated_days并在保存过多的方法中更新它。 然后通过这个新的领域做聚合。

覆盖:

 class Task(models.Model): progress = models.PositiveIntegerField() estimated_days = models.PositiveIntegerField() progress_X_estimated_days = models.PositiveIntegerField(editable=False) def save(self, *args, **kwargs): progress_X_estimated_days = self.progress * self.estimated_days super(Task, self).save(*args, **kwargs)