当使用SQLAlchemy的真棒混合方法功能时,我可以简单地将python表达式用于'和'和'或',还是我还需要提供@ .expression属性来显式构造SQLAlchemy查询和_ / or_构造?
例如,这会在Query.filter(Object.my_method(some_target_value)中“正常工作”吗?
class Object(db.Model):
...
@hybrid_method
def my_method(self, target):
return not self.target or self.target == target
答案 0 :(得分:1)
您需要明确提供表达式。原因是布尔运算符不可覆盖(因为它们进行短路评估),因此当self.target
为列时,not self.target or self.target == target
只评估为self.target == target
,因为self.target
是真实的。
答案 1 :(得分:1)
univerio的回答是正确的,我的用例还有另一个陷阱,所以我会发布正确用法的完整答案:
class Object(db.Model):
...
@hybrid_method
def my_method(self, target):
return not self.target or self.target == target
@my_method.expression
def my_method(cls, target):
return or_(
cls.target == None, # noqa - SQLAlchemy filters must use equality rather than 'is'
cls.target == target
)