tags:

views:

31

answers:

1

I'm trying to do this:

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=...)

...but I get errors like this:

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.

I've tried specifying foreign_keys and primary_join-s in the relationship declarations, but all for naught. Help? Is the inheritance of Bar from Foo messing with me?

thanks!

+1  A: 

Following should work (exactly what the error tells: missing 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))

As you can see, there are two foreign keys on the bar_id column. This could be required due to inheritance, or you might remove one. But if you do not store any other information apart of the many-to-many relationship, then you might consider Association Proxy instead.

van