2016-04-11 31 views
1

Birçok öz referansına bir çoğu ile aşağıdaki temel SQLAlchemy modeli vardır:SQLAlchemy özüne

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" 

    ) 

dernek tablo aşağıdaki gibidir:

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) 

İlişkilendirme tablosu, modelin kendisinden referans almak istediğim ek veri, is_customer ve is_supplier içerir, örneğin:

class Organisation(Base): 
    ... 

    def get_suppliers(self): 
     pass 

    def get_customers(self): 
     pass 
Şu anda

, ben 'müşterilerin kimliklerini ya, ilk dernek tablo, OrganisationMap sorgulama olmadan böyle bir liste alma almanın yolu yoktur 'tedarikçileri' ve ardından kimlikleri listesiyle Organisation tablo sorgulama.

Bu mümkün mü?

+0

[Bu soru] bölümüne bakın (http://stackoverflow.com/questions/7417906/sqlalchemy-manytomany-secondary-table-with-additional-fields). Kendinden referanslı kısım sadece konfigürasyonda nominal değişiklikler gerektirmelidir. – univerio

cevap

0

ORC olaylarını is_customer ve is_supplier öğelerinizi buna göre eklemek ve güncellemek için kullanabilmeniz gerektiğini düşünün. Yukarıdaki örnekte kullandığım olayların sizin için uygun olup olmadığını bilmiyorum. tam listesi için sqlalchemy ORM etkinlik sayfasını okuyun:

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

olaylar ' before_insert' ve before_update 'Bu purpouse için gayet mümkündür.

+0

Belki de çok iyi açıklayamadım. Zaten * ekleyebilir * ve * güncelleme * Tamam "Organizasyon" hedefleyen tarafından "OrganisationMap". 'Is_customer' veya' is_supplier' alanlarına bağlı olarak * ilgili nesneleri seçebilmeyi istiyorum. Örneğin, 'organisation_1.associated' ilişkili kuruluşların listesini döndürecektir. "Organisation_1.suppliers" veya "organisation_1.customers" için eşdeğerde bulunmam gerekiyor – user162390