web-dev-qa-db-ja.com

Django集計:戻り値の合計のみ?

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

26
Stephen

価値だけを手に入れる方法はないと思います。

テンプレートで_${{ 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

32
jproffitt

名前を付けて、次に尋ねます。

total_paid = Payment.objects.all.aggregate(sum=Sum('amount'))['sum']

もう少し読みやすくする必要があり、変換の必要はありません。

17
mehmet

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の部分が繰り返されないため、もう少し一般的です。

17
nimasmi

In Python

dict_valueslistに変換することで解決できます。

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)
1
lmiguelvargasf