我正在使用一些注释执行以下查询:
(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
我需要的数量。这解决了我的第一个问题,但第二个问题仍然存在。