Python 3 の場合:
を に変換することで解決できdict_values
ますlist
。
total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0] or 0 # the or 0 is required in case the query is an empty query set.
前のコードでは as key の使用を避けて'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)