количество агрегированных наборов запросов django - PullRequest
0 голосов
/ 20 октября 2018

Это вопрос продолжения из:
Набор запросов Django получает различные значения столбца относительно другого столбца

Моя проблема:

Использование агрегатного подсчета в Django подсчитывает неправильную вещь в наборе запросов, или, насколько я вижу, чего-то, чего нет даже в моем наборе запросов.

То, что я сделал Я использовал:

queryset.order_by('col1', 'col2').distinct('col1', 'col2').values('col2')

, чтобы получить значения col2 модели, в которой все строки имеют различную пару значений в (col1, col2).Пример есть по ссылке выше.Я напечатал свой набор запросов, и он выглядит хорошо, у меня есть

[{'col2': value1}, ... , {'col2': value1},{'col2': value2}, ..., {'col2': value2},...]

Теперь я хочу подсчитать, сколько каждого значения появляется в наборе запросов, который я получил.Я делаю это с помощью счетчика агрегации.У меня есть:

a = {'count': Count(F(col2), distinct=False)}
queryset.annotate(**a)

Я пробовал это также с `` Different = True ', но не повезло

Я ожидал бы получить [{col2:value1, count: num1}, {col2:value2, count: num2} ...].
Вместо этого я получил [{col2: value1, count: num11}, {col2: value1, count: num12}, ... ,{col2: value1, count: num_1n}, {col2: value2, count: num21}, ... ,{col2: value1, count: num_2n}, ...].Где, насколько я могу судить, num11, ...., num_1n - это количество строк value1, существовавших в col2, с любым конкретным значением в col1, предшествовавшим мне, используя order_by('col1', 'col2').distinct('col1', 'col2').values('col2') при подготовке запроса.

Iне могу понять, что может вызвать это.Я попытался посмотреть в параметре queryset.query, но я не могу понять, где я иду не так.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 октября 2018

.order_by должен указывать только 'col2', например:

queryset.values('col2').annotate(
    count=Count('col1', distinct=True)
).order_by('col2')

Таким образом, вы получите QuerySet, который выглядит следующим образом:

< QuerySet [
    {'col2': 1, 'count': 4 },
    {'col2': 2, 'count': 2 }
]>

Так что это означает, чтоесть четыре различных значения для col1, для данного col2 имеет значение 1, и два различных значения для col1 для данного col2 имеет значение 2.

Этосоздаст запрос наподобие:

SELECT col2, COUNT(DISTINCT col1) AS count
FROM some_table
GROUP BY col2
ORDER BY col2

.distinct(..) здесь не необходим , так как из-за GROUP BY мы будем получать только различные значения col2, и потому что мы COUNT(DISTINCT ..) это означает, что каждое отдельное значение col1 считается один раз.

...