Как определить два отношения к одной таблице в 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) 
  • Удаление объекта из сеанса SQLAlchemy до его сохранения
  • чтение подчиненного устройства, чтение-запись
  • Наследование python в sqlalchemy
  • Как написать DataFrame в таблицу postgres?
  • Подсчитайте количество строк в соединении «многие-ко-многим» (SQLAlchemy)
  • Объект «NoneType» не имеет атрибута «get» с использованием SQLAlchemy
  • Как настроить таблицу с рекурсивным внешним ключом и отношения декларативно в SQLAlchemy?
  • Запрос фильтра SQLAlchemy связанным объектом
  • Python - лучший язык программирования в мире.