2010-10-22 3 views
3

Je suis en train de le faire:sqlalchemy: multiples relations (plusieurs à plusieurs via l'objet de l'association)

class Foo(Base): 
    id = Column(Integer, primary_key=True) 

class Bar(Foo): 
    id = Column(Integer, primary_key=True) 

class FooBarAssociation(Base): 
    foo_id = Column(Integer, ForeignKey('foo_table.id')) 
    bar_id = Column(Integer, ForeignKey('bar_table.id')) 

    foo = relationship(Foo, backref=...) 
    bar = relationship(Bar, backref=...) 

... mais je reçois des erreurs comme ceci:

Could not determine join condition between parent/child tables on relationship FooBarAssociation.foo. Specify a 'primaryjoin' expression. If this is a many-to-many relationship, 'secondaryjoin' is needed as well. 

J'ai essayé de spécifier foreign_keys et primary_join-s dans les déclarations de relation, mais tout cela pour rien. Aidez-moi? Est-ce que l'héritage de Bar de Foo est avec moi?

merci!

Répondre

4

devrait fonctionner (exactement ce que l'erreur dit: manque primaryjoin):

class FooBarAssociation(Base): 
    foo_id = Column(Integer, ForeignKey('foo_table.id'), primary_key = True,) 
    bar_id = Column(Integer, ForeignKey('bar_table.id'), ForeignKey('foo_table.id'), primary_key = True,) 

    foo = relationship(Foo, backref="bars", primaryjoin=(foo_id==Foo.id)) 
    bar = relationship(Bar, backref="foos", primaryjoin=(bar_id==Bar.id)) 

Comme vous pouvez le voir, il y a deux clés étrangères sur la colonne bar_id. Cela peut être nécessaire en raison de l'héritage, ou vous pouvez en supprimer un. Mais si vous ne stockez aucune autre information en dehors de la relation many-to-many, alors vous pourriez envisager Association Proxy à la place.

Questions connexes