我正在尝试使用 django 的 queryset 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()
调用中)时遇到了类似的错误,但是在文档中没有找到任何关于计算列与“基本”列的不同之处。有人对此有任何见解吗?
(编辑了python代码,因为以前的版本有一个明显的逻辑缺陷(忘记了else分支)。仍然不起作用)