如何只使用Django条件聚合来求和正值?

时间:2016-04-12 12:42:39

标签: python django

我有一个看起来像这样的表:

class MeasureValue(models.Model):
    cost_saving_10th = models.FloatField(null=True, blank=True)

我知道如何得到所有值的总和:

mvs.aggregate(Sum('cost_saving')).values()[0]

但是如何获得所有值的总和?我想我需要一个条件聚合,但我不知道该怎么做。

3 个答案:

答案 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