Как определить два отношения к одной таблице в SQLAlchemy

Я просмотрел учебник по 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 Solutions collect form web for “Как определить два отношения к одной таблице в SQLAlchemy”

Начиная с версии 0.8, SQLAlchemy может разрешить неоднозначное соединение, используя только параметр keyword 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

Я думаю, вы почти все поняли; только вместо имен 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") 

Попробуйте параметр 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) 
  • Как интегрировать Redis с SQLAlchemy
  • Несколько доменов и поддоменов в одном экземпляре Pyramid
  • Простая проверка с помощью SQLAlchemy
  • Как установить SQLAlchemy на Ubuntu?
  • Динамическое определение класса Python в SQLAlchemy
  • SqlAlchemy Core и голосовой запрос
  • flask-session: как создать таблицу сеанса
  • Почему я получаю «NameError» с этим импортом?
  • Python - лучший язык программирования в мире.