2016-11-04 143 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