Сколько раз я получал требуемый список и сам в 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» и «сгруппировать в базе» почувствовалась, когда набор стал большим: меньше задержек, чище код. До этого момента делал по-глупому; теперь смотрю на агрегаты раньше, чем на ручной цикл.