django - 使用 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
我需要的数量。这解决了我的第一个问题,但第二个问题仍然存在。
解决方案
推荐阅读
- php - 在 OpenTBS/TinyButStrong 中合并水印
- python - 这是因为 sqlite 版本吗?"(": 语法错误: SELECT x, y, row_number() OVER ("
- perl - 通过只大写第一个字母来大写单词
- php - 如何在codeigniter中使用BETWEEN条件?
- python - 无法在 AWS Lambda 上创建用于发送邮件的 boto ses 客户端
- sql - 从左连接中删除行
- go - 不同级别的日志记录到不同的地方
- php - 更新完整日历中的事件不保存到数据库
- laravel - Laravel mix 会重新编译所有资产,即使只进行了 css 更改
- r - Rcpp 仍然找不到 Rtools