SQLAlchemy声明性表上的多对多关系

时间:2010-07-04 14:33:48

标签: python 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

个人资料通过多对多关系链接到问题。在链接表(答案)中,我需要为答案存储一个值。

文档说我需要使用一个关联对象来做这件事,但这让我感到困惑,我无法让它工作。

如何使用Answer作为中间表来定义Profile和Question表的多对多关系?

1 个答案:

答案 0 :(得分:13)

  

文档说我需要使用   一个关联对象,但是   这令我困惑,我无法得到它   工作。

没错。 Answer类是你的关联对象,因为它映射到关联表'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负责根据您对对象的关系属性的分配来相应地设置它们。 / p>

您可能有兴趣阅读 documentation for declarative ,尤其是关于 configuring relationships 的部分。阅读 working with related objects 也可能有所帮助。