SQLAlchemy many-many отношения на декларативных таблицах

Мне определили следующие таблицы декларативно (очень упрощенная версия):

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

Профиль связан с Вопросом через many-many отношения. В связывающей таблице (Ответ) я должен сохранить значение для ответа.

В документации говорится, что я должен использовать объект ассоциации сделать это, но она смущает меня, и я не могу заставить ее работать.

Как я определяю many-many отношения для таблиц Profile и Question с помощью Ответа в качестве посреднической таблицы?

10
задан Virgiliu 4 July 2010 в 15:57
поделиться

1 ответ

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

Верно. А класс Answer - это ваш объект ассоциации, поскольку он сопоставляется с таблицей ассоциаций 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 отвечает за их настройку на основе о ваших присвоениях атрибутам отношений ваших объектов.

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

13
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: