支払われた値のリストがあり、支払われた合計を表示したいと思います。集計と合計を使用して値を一緒に計算しました。問題は、合計値を出力したいだけですが、集計が出力されます:{'amount__sum': 480.0}
(480.0は付加価値の合計です。
私の見解では、私は:
from Django.db.models import Sum
total_paid = Payment.objects.all.aggregate(Sum('amount'))
そして、ページに値を表示するために、私は以下のmakoテンプレートを持っています:
<p><strong>Total Paid:</strong> ${total_paid}</p>
表示するにはどうすればよいですか480.0
の代わりに {'amount__sum': 480.0}
?
価値だけを手に入れる方法はないと思います。
テンプレートで_${{ total_paid.amount__sum }}
_を実行できます。または、ビューでtotal_paid = Payment.objects.all().aggregate(Sum('amount')).get('amount__sum', 0.00)
を実行します。
[〜#〜]編集[〜#〜]
他の人が指摘したように、.aggregate()
は常に、存在する集計からすべてのキーを含む辞書を返すため、結果に対して.get()
を実行する必要はありません。ただし、クエリセットが空の場合、各集計値はNone
になります。したがって、コードに応じて、フロートを期待している場合は、次のようにすることができます。
total_paid = Payment.objects.all().aggregate(Sum('amount'))['amount__sum'] or 0.00
名前を付けて、次に尋ねます。
total_paid = Payment.objects.all.aggregate(sum=Sum('amount'))['sum']
もう少し読みやすくする必要があり、変換の必要はありません。
aggregate()
メソッドは辞書を返します。単一エントリの辞書しか返さないことがわかっている場合は、.values()[0]
を使用できます。
Python 2の場合:
total_paid = Payment.objects.aggregate(Sum('amount')).values()[0]
Pythonでは、(@ lmiguelvargasfに感謝)これは次のようにする必要があります。
total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0]
最終結果は@jproffittの回答と同じですが、amount__sum
の部分が繰り返されないため、もう少し一般的です。
In Python:
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.
前のコードでは、キーとして'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)