[英]hybrid property with join in sqlalchemy
我可能没有完全掌握@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))
这需要我在需要使用days_ago属性时由调用者在Action
表上添加连接。 在我需要获取days_ago值的情况下,hybrid_property甚至是简化查询的正确方法吗?
无论如何,您需要通过加入或延迟加载来加载或访问Action
行(请注意,这里不清楚Event
vs. Action
是什么,我假设您只有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)
。 这在Join-Dependent Relationship Hybrid中解释。
如果你能负担得起使用相关的子查询,你的表达式可能会更好地作为column_property生成。 请参阅http://docs.sqlalchemy.org/en/latest/orm/mapping_columns.html#using-column-property-for-column-level-options 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.