简体   繁体   English

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

[英]SQLAlchemy many-to-many relationship on declarative tables

I have the following tables defined declaratively (very simplified version): 我声明性地定义了以下表(非常简化的版本):

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

Profile is linked to Question via a many-to-many relationship. 个人资料通过多对多关系链接到问题。 In the linking table (Answer) I need to store a value for the answer. 在链接表(答案)中,我需要为答案存储一个值。

The documentation says I need to use an association object to do this but it's confusing me and I can't get it to work. 文档说我需要使用一个关联对象来做这个,但它让我感到困惑,我无法让它工作。

How do I define the many-to-many relationship for the Profile and Question tables using Answer as the intermediary table? 如何使用Answer作为中间表来定义Profile和Question表的多对多关系?

The documentation says I need to use an association object to do this but it's confusing me and I can't get it to work. 文档说我需要使用一个关联对象来做这个,但它让我感到困惑,我无法让它工作。

That's right. 那就对了。 And the Answer class is your association object as it maps to the association table 'answer'. Answer类是你的关联对象,因为它映射到关联表'answer'。

How do I define the many-to-many relationship for the Profile and Question tables using Answer as the intermediary table? 如何使用Answer作为中间表来定义Profile和Question表的多对多关系?

The code you've presented in your question is correct. 您在问题中提供的代码是正确的。 It only needs additional information about relationships on the ORM level: 它只需要有关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")

    ...

Also, you shouldn't setup values for profile_id and question_id in your Answer's init function , because it's the ORM that's responsible for setting them accordingly based on you assignments to relationship attributes of your objects. 此外, 您不应在Answer的init函数中设置profile_id和question_id的值 ,因为ORM负责根据您对对象的关系属性的赋值来相应地设置它们。

You may be interested in reading documentation for declarative , especially the part about configuring relationships . 您可能对阅读声明性文档感兴趣,尤其是关于配置关系的部分。 Reading about working with related objects may be helpful as well. 阅读有关使用相关对象的信息也许有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM