Сколько раз я получал требуемый список и сам в Python считал по циклам — медленно и коряво. В какой-то момент понял: групповую статистику умеет сама база, и тащить всё в память незачем. Чувство было как от открытия секретного хода: COUNT стал «бесплатным», если сгруппировать на стороне SQL/ORM.
Нейтрально: GROUP BY разбивает строки на группы по значению столбца, а агрегат (COUNT/SUM/AVG) считает внутри каждой. Хотим — сколько привычек в какой группе.
from django.db.models import Count
groups = Habit.objects.values("category") .annotate(n=Count("id")) .order_by("-n")
# вернёт список из {"category": ..., "n": N}
-- тот же смысл в SQL
SELECT category, COUNT(id) AS n
FROM habits
GROUP BY category
ORDER BY n DESC;
Разница «считать в Python» и «сгруппировать в базе» почувствовалась, когда набор стал большим: меньше задержек, чище код. До этого момента делал по-глупому; теперь смотрю на агрегаты раньше, чем на ручной цикл.