无法在sqlalchemy中的@hybrid_property上应用过滤器

时间:2014-04-30 07:49:11

标签: sqlalchemy

代码很简单:

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')

1 个答案:

答案 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文档。