Как определить два отношения к одной и той же таблице в SQLAlchemy - PullRequest
17 голосов
/ 25 сентября 2011

Я просмотрел учебник по SQLAlchemy и другие подобные вопросы, но мне кажется, что я пытаюсь заставить это объединение работать:

Сценарий : у меня есть таблица pages, представленная моделью Page. Страницы могут быть созданы пользователем и отредактированы пользователем, но не обязательно один и тот же. Моя Page модель выглядит так (сокращенно):

class Page(Base):
    __tablename__ = 'pages'

    id = Column(Integer, primary_key = True)
    slug = Column(Text)
    title = Column(Text)
    direct_link = Column(Text)
    body = Column(Text)
    category_id = Column(Integer, ForeignKey('categories.id'))
    published_on = Column(DateTime)
    publishing_user_id = Column(Integer, ForeignKey('users.id'))
    last_edit_on = Column(DateTime)
    last_edit_user_id = Column(Integer, ForeignKey('users.id'))

    # Define relationships
    publish_user = relationship('User', backref = backref('pages', order_by = id), primaryjoin = "Page.publishing_user_id == User.id")
    edit_user = relationship('User', primaryjoin = "Page.last_edit_user_id == User.id")
    category = relationship('Category', backref = backref('pages', order_by = id))

Мои пользователи хранятся в таблице пользователей, представленной моделью User. Как я уже говорил, я искал все документы SQLAlchemy, я пытался сделать его максимально похожим на их пример, но безрезультатно. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

12 голосов
/ 07 марта 2015

Начиная с версии 0.8, SQLAlchemy может разрешить неоднозначное соединение, используя только параметр ключевого слова foreign_keys для relationship.

publish_user = relationship(User, foreign_keys=[publishing_user_id],
                                  backref=backref('pages', order_by=id))
edit_user = relationship(User, foreign_keys=[last_edit_user_id])

Документация на http://docs.sqlalchemy.org/en/rel_0_9/orm/join_conditions.html#handling-multiple-join-paths

7 голосов
/ 26 сентября 2011

Я думаю, вы почти все поняли;только вместо Model имен вы должны использовать Table имена при определении primaryjoin.Поэтому вместо

# Define relationships
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "Page.publishing_user_id == User.id")
edit_user = relationship('User', 
    primaryjoin = "Page.last_edit_user_id == User.id")

используйте:

# Define relationships
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "pages.publishing_user_id == users.id")
edit_user = relationship('User', 
    primaryjoin = "pages.last_edit_user_id == users.id")
2 голосов
/ 26 сентября 2011

Попробуйте foreign_keys опция:

publish_user = relationship(User, foreign_keys=publishing_user_id,
                                  primaryjoin=publishing_user_id == User.id,
                                  backref=backref('pages', order_by=id))
edit_user = relationship(User, foreign_keys=last_edit_user_id,
                               primaryjoin=last_edit_user_id == User.id)
...