我可能尚未@hybrid_property
完全掌握使用方法。但是我想做的是使基于另一个表中的列的访问计算值变得容易,因此需要联接。
所以我拥有的是这样的东西(可以工作,但是很尴尬,感觉不对):
class Item():
:
@hybrid_property
def days_ago(self):
# Can I even write a python version of this ?
pass
@days_ago.expression
def days_ago(cls):
return func.datediff(func.NOW(), func.MAX(Event.date_started))
这需要我Action
在需要使用days_ago属性时,由调用方在表上添加联接。hybrid_property甚至是简化我需要获取days_ago值的查询的正确方法吗?
您需要Action
通过联接或延迟加载来加载或访问行的一种或另一种方式(请注意,目前尚不清楚Event
vsAction
是什么,我假设您只有Item.actions -> Action
)。
非“表达式”版本days_ago
旨在对Action
仅与当前实例相关的对象起作用。通常,在混合环境中,这意味着只需迭代Item.actions
并在Python中针对加载的Action
对象执行操作。尽管在这种情况下,您正在寻找一个简单的聚合,但是您可以选择运行查询,但是它又是本地的,self
所以就像object_session(self).query(func.datediff(...)).select_from(Action).with_parent(self).scalar()
。
当针对另一个表形成混合表的表达式版本时,通常要求使用混合表的查询已经设置了正确的FROM子句,因此它看起来像session.query(Item).join(Item.actions).filter(Item.days_ago == xyz)
。这在“联接依赖关系混合”中进行了解释。
如果可以使用相关的子查询,则此处的表达式可能会更好地作为column_property生成。请参见http://docs.sqlalchemy.org/en/latest/orm/mapping_columns.html#using-column-property-for-column-level-options上的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句