在Python 3中:
您可以通过将dict_values
转换为list
来解决此问题:
total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0] or 0
上述代码避免使用'column_name__sum'
作为键,但如果您更喜欢字典方式:
total_paid = Payment.objects.aggregate(Sum('amount'))['amount__sum'] or 0
就效率而言,我用一些数据进行了测试,似乎使用字典键更快:
In [9]: %timeit total = Pledge.objects.filter(user=user, group__isnull=True).aggregate(Sum('amount'))['amount__sum'] or 0
3.13 ms ± 25.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [10]: %timeit total = list(Pledge.objects.filter(user=user, group__isnull=True).aggregate(Sum('amount')).values())[0] or 0
3.22 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
就易读性而言,我认为@mehmet的解决方案是最好的,并且我也测试了其效率:
In [18]: %timeit Pledge.objects.filter(user=user, group__isnull=True).aggregate(sum=Sum('amount'))['sum'] or 0
3.22 ms ± 124 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
aggregate(sum = Sum('amount'))
这个怎么样?在模板中可以这样使用${total_paid.sum}
。 - karthikr