We can perform a GROUP BY ... COUNT or a GROUP BY ... SUM SQL equivalent queries on Django ORM, with the use of annotate(), values(), the django.db.models‘s Count and Sum methods respectfully and optionally the order_by() method:
-
GROUP BY … COUNT:
from django.db.models import Count result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))Now result contains a dictionary with two keys:
authorandcount:author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ... -
GROUP BY … SUM:
from django.db.models import Sum result = Books.objects.values('author') .order_by('author') .annotate(total_price=Sum('price'))Now result contains a dictionary with two columns:
authorandtotal_price:author | total_price ------------|------------- OneAuthor | 100.35 OtherAuthor | 50.00 ... | ...
UPDATE 13/04/2021
As @dgw points out in the comments, in the case that the model uses a meta option to order rows (ex. ordering), the order_by() clause is paramount for the success of the aggregation!