Многократные аннотации Django возвращают неверные результаты - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать аннотацию в наборе запросов django.Аннотация представляет собой подсчет обратного внешнего ключа на основе условия.У меня проблема в том, что когда я делаю счет для одного обратного внешнего ключа с условием, я получаю правильные данные, но когда я делаю две аннотации, по одной для каждого обратного внешнего ключа.

Вот набор запросовс аннотацией подсчета для одного обратного внешнего ключа:

ExamResponse.objects.filter(
        course_class__course=course,
        exam__exam_type=Exam.PRACTICE,
        user__is_demo=False,
        ended__isnull=False,
        id=125752
    ).order_by(
        'user_id',
        'started'
    ).annotate(
        total_ecq_count=Sum(
            Case(
                When(
                    choice_questions__response_time__gte=ENGAGEMENT_THRESHOLD,
                    choice_questions__id__isnull=False,
                    then=1
                ),
                default=0,
                output_field=IntegerField()
            ), 
            distinct=True
        ),
    ).values('total_ecq_count')

Результаты (правильный результат):

<QuerySet [{'total_ecq_count': 1}]>

Запрос с двумя аннотациями подсчета

ExamResponse.objects.filter(
        course_class__course=course,
        exam__exam_type=Exam.PRACTICE,
        user__is_demo=False,
        ended__isnull=False,
        id=125752
    ).order_by(
        'user_id',
        'started'
    ).annotate(
        total_ecq_count=Sum(
            Case(
                When(
                    choice_questions__response_time__gte=ENGAGEMENT_THRESHOLD,
                    choice_questions__id__isnull=False,
                    then=1
                ),
                default=0,
                output_field=IntegerField()
            ), 
            distinct=True
        ),
        total_etq_count=Sum(
            Case(
                When(
                    text_questions__response_time__gte=ENGAGEMENT_THRESHOLD,
                    text_questions__id__isnull=False,
                    then=1
                ),
                default=0,
                output_field=IntegerField()
            ), 
            distinct=True
        ),
    ).values('total_ecq_count', 'total_etq_count')

Результаты: (Total_ecq_count увеличился с 1 до 3 !!!)

<QuerySet [{'total_ecq_count': 3, 'total_etq_count': 4}]>

1 Ответ

0 голосов
/ 20 февраля 2019

Я только что нашел эту статью, по-видимому, это известная ошибка, что две аннотации для двух разных внешних ключей создают повторяющиеся числа.https://code.djangoproject.com/ticket/25861

...