如何使Iterator对来自n个对象的字段求和

时间:2018-01-09 11:48:50

标签: python django

假设我有一个模特

class Testmodel():
   amount = models.IntegerField(null=True)
   contact = models.CharField()

现在我正在进行如下查询:

obj1 = Testmodel.objects.filter(contact = 123)

并假设它在任何情况下返回n个数字对象,如(obj1,obj2,obj3 ...)

所以,如果我想从所有返回的对象amount中得到(obj1,obj2,obj3 ...)的总和,那么如何以最好的方式做。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

通常在数据库级别比在Python中更好。我们可以使用.aggregate(..)

from django.db.models import Sum

Testmodel.objects.filter(contact=123).aggregate(total=Sum('amount'))['total']

.aggregate(total=Sum('amount'))将返回包含单个键值对的字典:'total'将与行的amount的总和相关联。如果没有选择任何行(即过滤器与任何内容都不匹配),则它会将None与密钥相关联。

鉴于数据库支持总结值(大多数数据库都是这样),您构造的查询类似于:

SELECT SUM(amount) AS total
FROM app_testmodel
WHERE contact = 123

答案 1 :(得分:2)

使用aggregate

from django.db.models import Sum
Testmodel.objects.filter(contact=123).aggregate(
        total_sum=Sum('amount')
)