我有一个看起来像这样的表:
class MeasureValue(models.Model):
cost_saving_10th = models.FloatField(null=True, blank=True)
我知道如何得到所有值的总和:
mvs.aggregate(Sum('cost_saving')).values()[0]
但是如何获得所有正值的总和?我想我需要一个条件聚合,但我不知道该怎么做。
答案 0 :(得分:4)
您可以使用Django Conditional Expressions:
from django.db.models import Sum, F, Case, When
MeasureValue.objects.all().aggregate(positive_sum_cost_saving_10th=Sum(Case(When(cost_saving_10th__gt=0, then=F('warranty')), default=0)))
{'positive_sum_cost_saving_10th': ... }
如果您不想过滤QuerySet以便通过其他某些字段进行聚合,这将特别有用。
答案 1 :(得分:2)
您可以在聚合之前过滤查询集,以便使用__gt
删除任何小于或等于0的值(__gte
将包含0' s,这样可以为求和做更多的工作)
mvs.filter(cost_saving_10th__gt=0).aggregate(Sum('cost_saving_10th'))
注意:由于您正在过滤查询集,因此可能会丢失查询集结果中的条目。
答案 2 :(得分:1)
使用filter
然后aggregate
:
>>> MeasureValue.objects.filter(cost_saving_10th__gte=0).aggregate(
... sum=Sum('cost_saving_10th'))
{'cost_saving_10th__sum': ... }
这里有一些例子:Django docs