Аргумент Django group_by в зависимости от order_by

Я борюсь (опять же) с функциональностью аннотирования Django, где фактический запрос SQL мне вполне понятен.

Цель:

Я хочу получить количество пользователей с определенным, скажем, status (это может быть просто любой столбец модели).

Подход (ы):

1) User.objects.values('status').annotate(count=Count('*'))

Это приводит к следующему запросу SQL

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 ? (Или в более широком смысле, почему второй подход «работает»?)

Некоторые детали :

  • Джанго 2.2.9
  • Postgres 9,4

Всего 1 ответ


Это объясняется здесь

Поля, которые упоминаются в части order_by () набора запросов (или которые используются в порядке по умолчанию для модели), используются при выборе выходных данных, даже если они не указаны иным образом в вызове values ​​().


Есть идеи?

10000