带有NullBooleanField的带有Count的注释会产生不正确的值

时间:2018-06-05 05:51:47

标签: django django-queryset django-annotate

我正在使用一些注释执行以下查询:

    (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 个答案:

没有答案