SQLAlchemy отношение "многие ко многим" в декларативных таблицах
У меня есть следующие таблицы, определенные декларативно (очень упрощенная версия):
class Profile(Base):
__tablename__ = 'profile'
id = Column(Integer, primary_key = True)
name = Column(String(65), nullable = False)
def __init__(self, name):
self.name = name
class Question(Base):
__tablename__ = 'question'
id = Column(Integer, primary_key = True)
description = Column(String(255), nullable = False)
number = Column(Integer, nullable = False, unique = True)
def __init__(self, description, number):
self.description = description
self.number = number
class Answer(Base):
__tablename__ = 'answer'
profile_id = Column(Integer, ForeignKey('profile.id'), primary_key = True)
question_id = Column(Integer, ForeignKey('question.id'), primary_key = True)
value = Column(Integer, nullable = False)
def __init__(self, profile_id, question_id, value):
self.profile_id = profile_id
self.question_id = question_id
self.value = value
Профиль связан с вопросом через отношения "многие-ко-многим". В таблице ссылок (Ответ) мне нужно сохранить значение для ответа.
В документации говорится, что мне нужно использовать объект ассоциации для этого, но это меня сбивает с толку, и я не могу заставить его работать.
Как определить отношение "многие ко многим" для таблиц профиля и вопроса, используя "Ответ" в качестве таблицы промежуточных?
Ответы
Ответ 1
В документации говорится, что мне нужно использовать объект ассоциации для этого, но это меня сбивает с толку, и я не могу это получить работать.
Это правильно. И класс Answer - это ваш объект ассоциации, поскольку он сопоставляется с таблицей ассоциаций "Ответ".
Как определить много-ко многим отношения для профиля и Таблицы вопросов, используя ответ как промежуточная таблица?
Код, который вы представили в своем вопросе, верен. Требуется дополнительная информация об отношениях на уровне ORM:
from sqlalchemy.orm import relationship
...
class Profile(Base):
__tablename__ = 'profile'
...
answers = relationship("Answer", backref="profile")
...
class Question(Base):
__tablename__ = 'question'
...
answers = relationship("Answer", backref="question")
...
Кроме того, вы не должны устанавливать значения для profile_id и question_id в своей функции init ответа, потому что это ORM, который отвечает за их установку соответственно на основе назначений атрибутов отношений ваших объектов.
Вам может быть интересно прочитать документацию для декларативного, особенно часть настройка отношений. Чтение о работе со связанными объектами также может быть полезно.