我有时需要在不同的查询中重用某个SQL表达式。如果表达式在所有情况下都查询同一个表,那么该模型似乎是一个很好的地方。但是,我并不总是需要标量属性,如果我不需要它,我就不会# 39;我想实施它。
以下是我的表现方式:
@hybrid_property
def some_property(self):
"""Allows the query-level expression to exist."""
raise NotImplemented
@some_property.expression
def some_property(cls):
"""Query blah blah blah."""
return case(
... snip ...
).label('some_property')
现在,标量实现什么都不做(引发NotImplemented
)。我怎么能避免写它?
我不能将该表达式设为类属性,因为我需要引用其中的类,而不能在类级代码中引用类:
class A(object):
c = A # NameError
理论上我可以使它成为类级别的属性,但没有很好的实现。
我能想到的唯一选择是在创建类并将其分配回类之后创建表达式。这是邪恶的。
答案 0 :(得分:1)
你不能这样做:
@declared_attr
def some_property(cls):
"""Query blah blah blah."""
return case(
... snip ...
).label('some_property')
答案 1 :(得分:1)
您可以尝试将其作为column property实施。列属性就像一个只有表达式部分的混合属性(这是你想要的,对吧?)。有一些限制,但对我来说这通常是有效的。使用deferred=true
可以避免在不需要时对其进行评估。
some_property = column_property(
select(**some column**).where(**some conditon**),
deferred=true
)