【发布时间】:2014-04-30 07:49:11
【问题描述】:
代码很简单:
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 的帮助下,我有点知道该怎么做了。
参数filter(*criterion) 应该是SQL expression object。我曾经认为它需要一个布尔值作为 arg,BUT NO!
条件是任何适用于 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.expression
def is_ok(self):
return and_(self.status > 30, self.status < 90).label('is_ok')
【问题讨论】:
-
太棒了。将您的解决方案添加为答案并接受它以获得良好的知识库。
-
我认为您的
.expression是关键。 :) -
小心错字:“@is_ok.expressoin”
标签: sqlalchemy