Django аргумент group_by в зависимости от order_by - PullRequest
1 голос
/ 16 января 2020

Я борюсь (снова) с функцией аннотирования 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

1 Ответ

1 голос
/ 16 января 2020

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...