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, который отвечает за их установку соответственно на основе назначений атрибутов отношений ваших объектов.

Вам может быть интересно прочитать документацию для декларативного, особенно часть настройка отношений. Чтение о работе со связанными объектами также может быть полезно.