63
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
34
Give it a name and then ask for it:
total_paid = Payment.objects.all.aggregate(sum=Sum('amount'))['sum']
Should be little more readable, and there is no need for conversion.
- [Django]-In django do models have a default timestamp field?
- [Django]-Django/Python assertRaises with message check
- [Django]-Django-rest-framework http put failing with 415 on django 1.5
25
The aggregate()
method returns a dictionary. If you know you’re only returning a single-entry dictionary you could use .values()[0]
.
In Python 2:
total_paid = Payment.objects.aggregate(Sum('amount')).values()[0]
In Python 3, (thanks @lmiguelvargasf) this will need to be:
total_paid = list(Payment.objects.aggregate(Sum('amount')).values())[0]
The end result is the same as @jproffitt’s answer, but it avoids repeating the amount__sum
part, so it’s a little more generic.
- [Django]-Where to store secret keys DJANGO
- [Django]-How to set django model field by name?
- [Django]-How to move a model between two Django apps (Django 1.7)
3
In Python 3:
You can solve it by converting the dict_values
to a 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.
The previous code avoids using 'column_name__sum'
as key, but in case you prefer the dictionary way:
total_paid = Payment.objects.aggregate(Sum('amount'))['amount__sum'] or 0
In terms of efficiency, I made a test with some data I have, and it seems that using the dictionary key is faster:
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)
In terms of readability, I think that @mehmet’s solution is the best one, and I have also test its efficiency:
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)
- [Django]-What is choice_set in this Django app tutorial?
- [Django]-WARNING: Running pip as the 'root' user
- [Django]-Django Setup Default Logging
0
(It’s only useful if you used decimal field)
Store a key value in a new variable and convert it to the float if you’re using a decimal. I think it’s the easiest way
total_paid = Payment.objects.all.aggregate(Sum('amount'))
# output: {'amount__sum':Decimal('0000.000000')
tp=total_paid['amount__sum']
new_total_paid=float(tp)
- [Django]-How can I embed django csrf token straight into HTML?
- [Django]-What are the limitations of Django's ORM?
- [Django]-Gunicorn Connection in Use: ('0.0.0.0', 5000)
0
100% you can solve your demand by this technique
from django.db.models import Sum
sum_count = Payment.objects.aggregate(Sum('amount'))
totalAmonut = sum_count['Qty__sum']
- [Django]-Count frequency of values in pandas DataFrame column
- [Django]-Django REST Framework: adding additional field to ModelSerializer
- [Django]-Is there a way to filter a queryset in the django admin?