首页 > 解决方案 > 使用 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我需要的数量。这解决了我的第一个问题,但第二个问题仍然存在。

标签: djangodjango-querysetdjango-annotate

解决方案


推荐阅读