我有一个带有一个'额外'字段的QuerySet:
query_set = data_model.extra(select={'status': '''CASE <sql-query here>''')
但是当我尝试排除或过滤此字段时:
query_set = query_set.exclude(status=1)
query_set = query_set.filter(status=2)
我收到错误:
Cannot resolve keyword 'status' into field. Choices are: <list of field from my models
here>
我知道'extra'意味着使用纯SQL(没有ORM),但'exclude'或'filter'方法是'ORM'方法。但在这种情况下,为什么其他方法,例如'values_list',工作正常:
values = query_set.values_list('status')
上面的代码不会产生任何异常。那么如何过滤或排除“额外”方法得到的字段?
这是一个非常简单的模型(但有很多字段),但这是我使用的“额外”方法:
qs = qs.extra(select={
'void_status': '''CASE
WHEN "orderitem".voided_date IS NULL
THEN {normal}
WHEN "orderitem".voided_date >= %s AND
"orderitem".voided_date < %s AND
"orderitem".created_date >= %s AND
"orderitem".created_date < %s
THEN {fully_voided}
WHEN "orderitem".voided_date >= %s AND
"orderitem".voided_date < %s
THEN {voided}
ELSE {normal}
END'''.format(normal=1,
voided=2,
fully_voided=3)
}, select_params=[start, end] * 3)