Аннотирование с помощью Count приводит к неправильным значениям с NullBooleanField - PullRequest
0 голосов
/ 05 июня 2018

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

    (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.Это решает мою первую проблему, но вторая проблема все еще остается.

...