我正在尝试使用Django的查询集API来模拟以下查询:
SELECT EXTRACT(year FROM chosen_date) AS year,
EXTRACT(month FROM chosen_date) AS month,
date_paid IS NOT NULL as is_paid FROM
(SELECT (CASE WHEN date_due IS NULL THEN date_due ELSE date END) AS chosen_date,* FROM invoice_invoice) as t1;
主要的想法是在某些情况下,我更愿意使用
date_due
列而不是date
列,但是由于date_due
是可选的,有时我仍然必须使用date
作为备选项,并创建一个计算列chosen_date
以不必更改其余查询。这是我第一次尝试模拟它,我无法真正看到如何使用基本API正确地执行空值测试,因此我使用了extra
:if(use_date_due):
sum_qs = sum_qs.extra(select={'chosen_date': 'CASE WHEN date_due IS NULL THEN date ELSE date_due END'})
else:
sum_qs = sum_qs.extra(select={'chosen_date':'date'})
sum_qs = sum_qs.extra(select={'year': 'EXTRACT(year FROM chosen_date)',
'month': 'EXTRACT(month FROM chosen_date)',
'is_paid':'date_paid IS NOT NULL'})
但我遇到的问题是,当我运行第二个查询时,会出现一个错误,指出
chosen_date
列不存在。当我尝试使用计算列(比如在 annotate()
调用中)时,我也遇到了类似的错误,但文档中没有关于计算列与“基础”列之间的区别的说明。有人能提供一些见解吗?(由于之前版本存在明显的逻辑缺陷(忘记了 else 分支),因此进行了编辑 Python 代码,但仍然无法正常工作。)