2016-08-02 19 views
-1

我用SQLAlchemy聲明瞭一個有點複雜的模型。我有一個基本的對象(字段不是在這種情況下很重要):與SQLAlchemy中不同的其他對象,自我和屬性的多對多關係

class A(Base): 
    __tablename__ = 'as' 

class B(Base): 
    __tablename__ = 'bs' 

現在我要聲明這些對象的集合,這將是很容易用一個簡單的relationship,但不幸的是,我需要的followinf class C

  • 稱爲members一個字段可以指向AB對象
  • 它還必須能夠包含對其他C對象的引用,以及任意數量。
  • 映射需要附加一個屬性。

我認爲第三個要點很簡單,如http://pythoncentral.io/sqlalchemy-association-tables/所述。我不知道第一個是否可能,並且我沒有把頭纏到第二個。我嘗試了一個簡單的relationship('C'),但這導致SQLAlchemy抱怨很多重複的外鍵字段。

回答

0

答案是使用加入表繼承here所述。

首先,添加一個共同的父類爲相似的類,有一個字段命名類型(或其他任何東西)作爲鑑別...

class E(Base): 
    __tablename__ = 'es' 
    id = COlumn(Integer, primary_key=True) 
    type = Column(String) 

...然後添加映射參數:

__mapper_args__ = { 
     'polymorphic_identity': 'es', 
     'polymorphic_on': type, 
     'with_polymorphic': '*' 
    } 

讓類似的類繼承它...

class A(E): 
    __tablename__ = 'as' 

...並讓他們使用共享主/外鍵和正確的映射ARGS:

id = Column(Integer, ForeignKey('es.id'), primary_key=True) 

    __mapper_args__ = { 
     'polymorphic_identity': 'as' 
    } 

(同去的B

關係可以然後向E類定義。

如果您遺漏了backref,與包含關係的類的關係就會起作用。