Django Aggreagtion: Sum return value only?

Stephen  picture Stephen · Oct 2, 2013 · Viewed 25.6k times · Source

I have a list of values paid and want to display the total paid. I have used Aggregation and Sum to calculate the values together. The problem is,I just want the total value printed out, but aggreagtion prints out: {'amount__sum': 480.0} (480.0 being the total value added.

In my View, I have:

    from django.db.models import Sum

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

And to show the value on the page, I have a mako template with the following:

    <p><strong>Total Paid:</strong> ${total_paid}</p>

How would I get it to show 480.0 instead of {'amount__sum': 480.0}?

Answer

jproffitt picture jproffitt · Oct 2, 2013

I don't believe there is a way to get only the value.

You could just do ${{ total_paid.amount__sum }} in your template. Or do total_paid = Payment.objects.all().aggregate(Sum('amount')).get('amount__sum', 0.00) in your view.

EDIT

As others have pointed out, .aggregate() will always return a dictionary with all of the keys from the aggregates present, so doing .get() on the result is not necessary. However, if the queryset is empty, each aggregate value would be None. So depending on your code, if you are expecting a float, you could do:

total_paid = Payment.objects.all().aggregate(Sum('amount'))['amount__sum'] or 0.00