2016-04-11 20 views
1

I多くの自己参照の多くは、次の基本的なSQLAlchemyのモデルを持っている:SQLAlchemyの自己参照

class Organisation(Base): 
    __tablename__ = 'organisation' 

    name = Column(String(50)) 
    url = Column(String(128)) 
    associated = relationship(
         'Organisation', 
         secondary="organisation_map", 
         primaryjoin="Organisation.id==organisation_map.c.organisation_id", 
         secondaryjoin="Organisation.id==organisation_map.c.assoc_organisation_id", 
         backref="account_organisation" 

    ) 

アソシエーションテーブルは次のようになります。

class OrganisationMap(Base): 
    __tablename__ = 'organisation_map' 

    organisation_id = Column(Integer, ForeignKey('organisation.id')) 
    assoc_organisation_id = Column(Integer, ForeignKey('organisation.id')) 
    is_customer = Column(Boolean, default=False) 
    is_supplier = Column(Boolean, default=False) 

アソシエーションテーブルには、モデル自体から参照できるようにするために、is_customeris_supplierの余分なデータが含まれています。

class Organisation(Base): 
    ... 

    def get_suppliers(self): 
     pass 

    def get_customers(self): 
     pass 
現時点で

は、私は、最初の関連テーブルを照会せずに、このようなリストを取得する方法はありませんOrganisationMapIDSに「顧客」や「サプライヤーののを取得し、その後IDのリストでOrganisationテーブルを照会します

これは可能ですか?

+0

[この質問](http://stackoverflow.com/questions/7417906/sqlalchemy-manytomany-secondary-table-with-additional-fields)を参照してください。自己参照パーツは、構成に対して名目上の変更が必要なだけです。 – univerio

答えて

0

ORMイベントを使用してis_customerとis_supplierを挿入して更新できるはずです。私:

@event.listens_for(OrganisationMap, 'after_insert') 
@event.listens_for(OrganisationMap, 'after_update') 
def update_organization_map(mapper, connection, target): 
    # query your db to fill this 2 fields accordingly 
    # you have the connection object 
    target.is_customer = query_to_fill_is_customer 
    target.is_supplier = query_to_fill_is_supplier 

上記の例で使用したイベントが正常かどうかわかりません。 完全なリストについてはSQLAlchemyのORMのイベントページをお読みください:

http://docs.sqlalchemy.org/en/latest/orm/events.html

before_insert "のイベントやbefore_updateが「このpurpouseの罰金であることが可能です。

+0

私はおそらくとてもうまく説明しなかったでしょう。 'Organisation'とそれに続く' OrganisationMap'をターゲットにして、* insert *と* update * okを追加できます。 'is_customer'または' is_supplier'フィールドに基づいて関連するオブジェクトを*選択*することができるようにしたいと思います。例えば、 'organisation_1.associated'は関連する組織のリストを返します。私は 'organisation_1.suppliers'や' organisation_1.customers'に相当する必要があります – user162390