Аннотирование на отдельный кверисет 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))
Вернуться на верх