Я выполняю следующий запрос с несколькими аннотациями:
(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
.Это решает мою первую проблему, но вторая проблема все еще остается.