Аннотирование с помощью Count приводит к неправильным значениям с NullBooleanField

Я выполняю следующий запрос с несколькими аннотациями:

    (AwardIssueProcess.objects.filter(grant__client=client, completed=completed_status)
        .annotate(total_awarded=Sum('award__awardissuedactivity__units_awarded'),
                  num_accepted=Count(Case(When(award__accepted=True, then=1))),
                  num_rejected=Count(Case(When(award__accepted=False, then=1))),
                  num_unaccepted=Count(Case(When(award__accepted=None, then=1)))))

Тем не менее num_unaccepted дает неверные значения. Во-первых, если у меня есть награды, число иногда вдвое больше, чем я ожидаю. Но если я уберу

total_awarded=Sum('award__awardissuedactivity__units_awarded')

от аннотации проблема удвоения исчезнет.

Во-вторых, num_unaccepted имеет значение 1, если нет наград. Но когда есть награды, значение является правильным (но не во всех случаях из-за проблемы удвоения, о которой я упоминал ранее). Во втором выпуске я подозреваю, что это может быть связано с тем, что None, но то, что я действительно хочу, это чтобы проверить, если accepted поле None, А потом, если награды не существует, просто не считайте ее. accepted поле является NullBooleanField,

Как я должен писать это по-другому, чтобы решить эти две проблемы с num_unaccepted?

РЕДАКТИРОВАТЬ

Я удалил total_awarded=Sum('award__awardissuedactivity__units_awarded') из аннотации и создал отдельную функцию, чтобы получить total_awarded количество, которое мне нужно. Это решает мою первую проблему, но вторая проблема все еще остается.

0 ответов

Другие вопросы по тегам