混合属性加入sqlalchemy

Zit*_*rax 3 python sql 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))
Run Code Online (Sandbox Code Playgroud)

这需要我Action在需要使用days_ago属性时由调用者在表上添加连接.在我需要获取days_ago值的情况下,hybrid_property甚至是简化查询的正确方法吗?

zzz*_*eek 8

这种或那种方式,你需要加载或访问Action或者通过参加或通过延迟加载行(注意这里并不清楚什么EventAction的,我假设你刚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.