SQLAlchemy отношение «многие ко многим» в декларативных таблицах - PullRequest
10 голосов
/ 04 июля 2010

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

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 Ответ

13 голосов
/ 05 июля 2010

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

Это верно. А класс 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 в функции инициализации вашего Ответчика , потому что именно ORM отвечает за их установку в соответствии с вашими назначениями атрибутов отношений ваших объектов. *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...