2016-04-15 5 views
0

Angenommen, ich modelliere postalische Adressenänderungen. Ich möchte, dass jede AddressChange eine before Beziehung zu einer Address, sowie eine after Beziehung zu einer anderen Address hat. Und ich würde gerne eine Referenz zurück von der Address zu der AddressChange es zugeordnet ist.Zwei "eins-zu-eins" Verweise auf die gleiche Tabelle in SQLAlchemy

class AddressChange(Base): 
    __tablename__ = 'AddressChanges' 

    id = Column(Integer, primary_key=True) 

    before_id = Column(Integer, ForeignKey('Addresses.id')) 
    before = relationship('Address', foreign_keys=before_id, uselist=False, 
    back_populates='change') 

    after_id = Column(Integer, ForeignKey('Addresses.id')) 
    after = relationship('Address', foreign_keys=after_id, uselist=False, 
    back_populates='change') 


class Address(Base): 
    __tablename__ = 'Addresses' 

    id = Column(Integer, primary_key=True) 
    street, city, etc = Column(String), Column(String), Column(String) 

    change = relationship('AddressChange') 

jedoch SQLAlchemy klagt:

konnte nicht feststellen Zustand zwischen Eltern/Kind-Tabellen auf Beziehung Address.change beitreten - es gibt mehrere Fremdschlüssel Pfade die Tabellen zu verknüpfen. Geben Sie das Argument 'foreign_keys' an und geben Sie eine Liste der Spalten an, die gezählt werden sollen und die einen Fremdschlüsselbezug zur übergeordneten Tabelle enthalten.

Mein Address nicht haben ein Fremdschlüssel Bezug auf die übergeordnete Tabelle, und es ist mir nicht klar, warum es eine brauchen sollte. Wenn ich eins hinzufüge, bekomme ich

Address.change und zurück-referenz AddressChange.before sind beide der gleichen Richtung Symbol ('MANYTOONE'). Hast du vor, remote_side auf der Viele-zu-Eins-Seite zu setzen?

Das wird verwirrend, weil die Dokumentation für remote_side für "selbstreferenzielle Beziehungen" ist.

Antwort

1

Danke an @ alex-grönholm für die Hilfe auf #sqlalchemy.

Dies kann durch Zugabe eines primaryjoin Parameter Address ‚s Seite der Beziehung sie zu lehren, gelöst werden, wie der Mutter AddressChange zurück zur Karte:

change = relationship('AddressChange', uselist=False, 
    viewonly=True, 
    primaryjoin=or_(
    AddressChange.before_id == id, 
    AddressChange.after_id == id 
)) 
+0

Ich habe' Viewonly = true' nach dem Debuggen mit Elmer im IRC. – rgov

Verwandte Themen