2016-11-04 270 views
0

我有三個相關的類:Parent,Child,SubChild。兩種情況下的關係都是一對多的關係。我已經設置好了,所以child.parent引用正確,當然也使sub_child.child.parent也適用。通過中間表的sqlalchemy關係

事情是,我從來沒有真正需要知道sub_child.child,但我確實需要知道sub_child的最終父母。我想建立一個關係,使得sub_child.parent將返回對最終父對象的引用。

這是可能的,還是它只是一個壞主意?我已經閱讀了文檔,但看不到太多看起來很有希望的文檔。

我在mysql上使用python2和sqlalchemy orm作爲後端。

回答

1

看一看http://docs.sqlalchemy.org/en/latest/orm/nonstandard_mappings.html

有了這個方法,你應該能夠創造超過你所提到的三個表的映射,並指定參賽表的列的屬性中映射類。

metadata = MetaData() 

parent = Table('parent', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('child', Integer, ForeignKey('child.id')), 
) 
child = Table('child', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('subchild', Integer, ForeignKey('subchild.id')), 
) 
subchild = Table('subchild', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('some_column', String), 
) 
joined = join(parent, child, subchild) 

Base = declarative_base() 

class Parent(Base): 
    __table__ = joined 

    id = column_property(parent.c.id, child.c.id, subchild.c.id) 
    subchild_attr = subchild.c.some_column 
+0

有趣的是 - 這是否將查找卸載到數據庫,還是在ORM層處理?作爲一種替代方法,我正在尋找在類上定義一些簡單的getter函數。 – domoarrigato

+0

是的,使用這個mapper的查詢將無需進一步的努力就可以加入所有的三張表。當然你也可以用'@property'來「拉起」嵌套的列,但是你必須使用像'joinedload'這樣的查詢選項,以避免後續的查詢。如果你選擇getter版本,看一下'@hybrid_property'裝飾器。 – roman