我有一个像这样的模型
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
现在我想在数据库级别上进行计算Sum(progress * estimated_days)
。使用Django聚合我可以得到每个字段的总和,但不能得到字段乘法的总和。
答案 0 :(得分:68)
更新:请按照@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']
)
注意:如果两个字段属于不同类型,请说integer
& float
,您要返回的类型应作为Sum
这是一个迟到的答案,但我想它会帮助某人寻找相同的答案。
答案 1 :(得分:61)
使用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']
答案 2 :(得分:24)
解决方案取决于Django版本。
django< 1.8 强>
from django.db.models import Sum
MyModel.objects.filter(<filters>).aggregate(Sum('field1', field="field1*field2"))
django&gt; = 1.8
from django.db.models import Sum, F
MyModel.objects.filter(<filters>).aggregate(Sum(F('field1')*F('field2')))
答案 3 :(得分:2)
您有几种选择:
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)