2013-11-14 138 views
3

我可能沒有完全掌握@hybrid_property的使用。但是我試圖做的就是使得基於另一個表中的列訪問計算值變得容易,因此需要連接。加入sqlalchemy混合財產

所以我已經是這樣的(這工作,但很彆扭,感覺錯了):

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是否也是如此?

回答

7

這種或那種方式,你需要或者通過參加或通過延遲加載加載或訪問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