3

我可能还没有@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 属性时由调用者在表上添加联接。在我需要掌握 days_ago 值的地方,hybrid_property 甚至是简化查询的正确方法吗?

4

1 回答 1

8

您需要以一种或另一种方式Action通过连接或延迟加载来加载或访问行(注意这里不清楚Eventvs.Action是什么,我假设您只是Item.actions -> Action)。

非“表达式”版本days_ago旨在针对Action仅与当前实例相关的对象起作用。通常在混合中,这意味着只需在 Python 中对加载的对象进行迭代Item.actions和执行操作。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

于 2013-11-15T17:38:41.997 回答