2016-11-04 25 views
0

私は3つの関連するクラス、Parent、Child、SubChildを持っています。どちらの場合も、関係は1対多です。私はchild.parentの参照が正しく設定されているので、もちろんsub_child.child.parentも同様に動作します。中間テーブルを介したsqlalchemy関係

事実、実際にはsub_child.childを知る必要はありませんが、私はsub_childの最終的な親を知る必要があります。 sub_child.parentが究極のParentオブジェクトへの参照を返すような関係を設定したいと思います。

これは可能ですか、それとも悪い考えですか?私はドキュメンテーションを読んだが、有望に見えるものはあまり見ない。

私はMySQLでバックエンドとしてpython2とsqlalchemy ormを使用しています。

答えて

1

はあなたが言及した3つのテーブルの上にマッピングを作成し、マッピングクラスの属性として参加したテーブルの列を割り当てることができる必要があり、この方法では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レイヤーで処理するのでしょうか?代わりに、私はクラスでいくつかの簡単なゲッター関数を定義することを検討していました。 – domoarrigato

+0

はいこのマッパーを使用したクエリは、さらに努力することなく3つのテーブルをすべて結合します。もちろん、ネストされたカラムを '@property'で "プルアップ"することもできますが、その後のクエリを避けるためには 'joinedload'のようなクエリオプションを使用する必要があります。 getter版を使う場合は、 '@hybrid_property'デコレータを見てください。 – roman

関連する問題