sqlalchemy: несколько отношений (многие ко многим через объект ассоциации)

Я пытаюсь сделать это:

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

... но я получаю такие ошибки:

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.

Я пробовал указывать external_keys и primary_join-s в объявлениях отношений, но все напрасно. Помощь? Наследство Бара от Фу надо мной издевается?

Благодарность!


person Colin    schedule 22.10.2010    source источник


Ответы (1)


Следующее должно работать (именно то, что говорит об ошибке: отсутствует 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))

Как видите, в столбце bar_id есть два внешних ключа. Это может потребоваться из-за наследования, или вы можете удалить его. Но если вы не храните никакой другой информации, кроме отношения «многие ко многим», вы можете рассмотреть Прокси ассоциации вместо этого.

person van    schedule 27.10.2010