Я борюсь (снова) с функцией аннотирования Django, где фактический запрос SQL мне вполне понятен.
Цель:
Я хочу получить количество пользователей с определенным, скажем, status
(это может быть просто любой столбец модели).
Подход (-ы):
1) User.objects.values('status').annotate(count=Count('*'))
Это приводит к следующему SQL query
SELECT users_user.status, COUNT(*) as count
FROM users_user
GROUP BY users_user.id
ORDER BY usser_user.id ASC
Однако, это даст мне набор запросов всех пользователей, каждый из которых «аннотирован» значением счетчика , Такое поведение я бы ожидал.
2) User.objects.values('status').annotate(count=Count('*')).order_by()
Это приводит к следующему SQL запросу
SELECT users_user.status, COUNT(*) as count
FROM users_user
GROUP BY users_user.status
Нет ORDER BY
и теперь аргумент GROUP BY
- это столбец status
. Это не то, что я ожидал, но результат, который я искал .
Вопрос : Почему Django order_by()
без каких-либо аргументов влияет на SQL GROUP BY
аргумент? (Или более широко, почему второй подход "работает"?)
Некоторые детали :
- django 2.2.9
- postgres 9,4