SQLAlchemy混合方法 - 使用Python和/或表达式

时间:2016-03-17 21:38:23

标签: python sqlalchemy

当使用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

2 个答案:

答案 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
    )