代码很简单:
Class A(Base):
status = Columns(Integer)
@hybrid_property
def is_ok(self):
return self.status > 0
但是
session.query(A).filter(A.is_ok).all()
会引发异常:TypeError: Boolean value of this clause is not defined
。
我试过print result[0].is_ok, type(result[0].is_ok)
。那是True <type 'bool'>
。
那么如何根据hybrid_property
我的回答
在@van的帮助下,我知道如何。
arg filter(*criterion)
需要SQL expression object。我曾经认为它需要一个布尔值作为arg,但是没有!
标准是适用于select的WHERE子句的任何SQL表达式对象。字符串表达式通过text()构造强制转换为SQL表达式构造。
代码告诉:
# wrong code:
@is_ok.expression
def is_ok(self):
return self.status > 30 and self.status < 90
# correct code:
from sqlalchemy.sql import and_
@is_ok.expressoin
def is_ok(self):
return and_(self.status > 30, self.status < 90).label('is_ok')
答案 0 :(得分:1)
添加自定义表达式。下面使用CASE
语句,但如果db支持它,您也可以使用IF
:
@is_ok.expression
def is_ok(cls):
return case([(cls.status > 0, True)], else_=False).label("is_ok")
有关详细信息,请参阅Defining Expression Behavior Distinct from Attribute Behavior
文档。