sqlalchemy: множественные отношения (многие ко многим через объект ассоциации) - PullRequest
3 голосов
/ 23 октября 2010

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

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.

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

спасибо!

1 Ответ

4 голосов
/ 27 октября 2010

Должно работать следующее (именно то, что говорит ошибка: отсутствует 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 есть два внешних ключа. Это может потребоваться из-за наследования или вы можете удалить его. Но если вы не храните никакую другую информацию, кроме отношения «многие ко многим», то вместо этого вы можете рассмотреть Proxy ассоциации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...