9

クラス X と Y と、それらの間の関係 x2y と y2x を考えてみましょう。class_mapper(Class).iterate_properties イテレータから、すべてのクラスのプロパティを取得できます。したがって、x2y と y2x は RelationshipProperty であり、取得したいのは、リレーションのリモート側にあるオブジェクトのクラスまたはクラス名です。

私はすでに解決策を作ろうとしました。私は見つけx2y.remote_side[0].table.nameて、テーブル名をクラスにマップするtables_mapを作成しました。これは、1対多および1対1で正常に機能します。多対多に使用する場合、テーブル名は関連テーブルです。

リモート側のクラスを取得する方法についてのヒントはありますか?

4

2 に答える 2

26

X.x2y.property.mapper.class_

relatonshipproperty は、マッパーが現在行っているのと同じように、最終的にクラスレベルの属性ドキュメントを取得します。

編集。これは、「X」から「Y」を返す上記を示すテストであり、リフレクションがない場合は関係が作成されないため、効果はありません。

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class X(Base):
    __tablename__ = 'x'
    id = Column(Integer, primary_key=True)
    x2y = relationship("Y")

class Y(Base):
    __tablename__ = 'y'
    id = Column(Integer, primary_key=True)
    x_id = Column(Integer, ForeignKey("x.id"))

assert X.x2y.property.mapper.class_ is Y
于 2011-07-27T19:32:56.340 に答える
3

relationshipproperty のメソッド argument() がリモート クラスを返すことがわかりました。

for prop in class_mapper(X).iterate_properties:
    if isinstance(prop, RelationshipProperty):
        relation = prop
relation.argument()
于 2011-07-31T12:21:34.673 に答える