34

支払った値のリストがあり、支払った合計を表示したいと考えています。集計を使用しSumて、値を一緒に計算しました。問題は、合計値を出力したいだけですが、集計が出力されることです: {'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}ですか?

4

6 に答える 6

22

aggregate()メソッドは辞書を返します。単一エントリの辞書のみを返すことがわかっている場合は、 を使用できます.values()[0]

Python 2 の場合:

total_paid = Payment.objects.aggregate(Sum('amount')).values()[0]

Python 3では、(@lmiuelvargasf に感謝) これは次のようにする必要があります。

total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0]

最終結果は@jproffittの回答と同じですが、そのamount__sum部分の繰り返しを避けるため、もう少し一般的です。

于 2014-09-25T16:18:34.110 に答える
2

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)
于 2018-01-07T03:04:10.703 に答える