2016-08-02 6 views
-1

Ich erkläre ein etwas kompliziertes Modell mit SQLAlchemy. Ich habe Grundobjekte wie (Felder in diesem Fall nicht von Bedeutung sind):Viele-zu-viele Beziehung mit verschiedenen anderen Objekten, Selbst und Attributen in SQLAlchemy

class A(Base): 
    __tablename__ = 'as' 

class B(Base): 
    __tablename__ = 'bs' 

Jetzt habe ich eine Sammlung solcher Objekte erklären wollen, die mit einem einfachen relationship leicht sein würde, aber leider, muss ich die followinf class C :

  • A als auch Verweise auf andere C Objekte können, verweisen kann enthalten members, die zu einer beliebigen Anzahl von A und B Objekte
  • Es muss auch als einzelnes Feld.
  • Den Zuordnungen muss ein Attribut zugewiesen sein.

Ich denke, der dritte Punkt ist einfach, wie unter http://pythoncentral.io/sqlalchemy-association-tables/ beschrieben. Ich weiß nicht, ob der erste möglich ist, und ich lasse meinen Kopf nicht um den zweiten wickeln. Ich versuchte ein einfaches relationship('C'), aber das führte zu SQLAlchemy, das sich viel über doppelte Fremdschlüsselfelder beschwert.

Antwort

0

Die Antwort ist zu verwenden verbundenen Tabelle Vererbung wie beschrieben here.

Fügen Sie zunächst eine gemeinsame Elternklasse für die ähnlichen Klassen, mit einem Feld mit dem Namen Typ (oder etwas anderes) als Unterscheidungs ​​...

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

... dann Mapper Argumente hinzufügen:

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

Lassen Sie die ähnlichen Klassen von ihm erben ...

class A(E): 
    __tablename__ = 'as' 

... und haben sie eine gemeinsame primäre verwenden/Fremdschlüssel und die richtigen Mapper argumente:

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

    __mapper_args__ = { 
     'polymorphic_identity': 'as' 
    } 

(Das Gleiche gilt für B geht)

Eine Beziehung dann in Richtung Klassen E definiert werden können.

Die Beziehung zu der Klasse, die die Beziehung selbst enthält, funktioniert nur, wenn Sie die backref auslassen.

Verwandte Themen