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
这是一个迟到的答案,但我想它会帮助有人寻找同样的东西.
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)
小智 27
解决方案取决于Django版本.
django <1.8
from django.db.models import Sum
MyModel.objects.filter(<filters>).aggregate(Sum('field1', field="field1*field2"))
Run Code Online (Sandbox Code Playgroud)django> = 1.8
from django.db.models import Sum, F
MyModel.objects.filter(<filters>).aggregate(Sum(F('field1')*F('field2')))
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
30193 次 |
| 最近记录: |