Аннотирование на отдельный кверисет Django больше не использует отдельный кверисет
У меня есть запрос, и я пытаюсь аннотировать подсчет каждого значения для поля tail_tip
. Мой исходный запрос фильтрует по связанной таблице, поэтому необходимо использовать distinct().
Я не совсем уверен, как описать, но кажется, что когда я аннотирую запрос distinct, запрос больше не является distinct. Вот мои запросы, с которыми я играю в оболочке
// Without distinct()
Ski.objects.filter(published=True, size__size__in=[178, 179, 180, 181, 182, 183, 184]).count()
// 318
skis = Ski.objects.filter(published=True, size__size__in=[178, 179, 180, 181, 182, 183, 184]).distinct()
skis.count()
// 297
skis.values('tail_tip').order_by('tail_tip').annotate(count=Count('tail_tip'))
// <QuerySet [{'tail_tip': 'flat', 'count': 99}, {'tail_tip': 'full_twin', 'count': 44}, {'tail_tip': 'partial_twin', 'count': 175}]>
// total count = 318
Учитывая, что skis
уже distinct()
, я не знаю, почему, когда я аннотирую его, общий подсчет становится равным нерасчлененному запросу.
Предположим, что связанные таблицы с именами Size
и Ski
имеют с ней отношения один-ко-многим. Это можно сделать следующим образом:
ski_filtered = Ski.objects.filter(
published=True,
id__in=Size.objects.values("skis__id").filter( # Maybe somethig else than `skis` here, you didn't show its model, so I couldn't know
size__in=[178, 179, 180, 181, 182, 183, 184]
)
)
skis.values('tail_tip').distinct().order_by('tail_tip').annotate(count=Count('tail_tip'))
Почему так: DISTINCT
не может быть использован с annotate()
. Реализация annotate()
в django сделана с собственным пунктом GROUP BY
. Поэтому применение distinct()
к уже GROUP BY
-му запросу просто не могло работать.
Попробуйте добавить distinct=True
:
skis.values('tail_tip').order_by('tail_tip').annotate(count=Count('tail_tip', distinct=True))