Flask/SQLAlchemy-多对多关系的关联模型和关联表之间的差异?

Flask/SQLAlchemy-多对多关系的关联模型和关联表之间的差异?,flask,sqlalchemy,many-to-many,flask-sqlalchemy,model-associations,Flask,Sqlalchemy,Many To Many,Flask Sqlalchemy,Model Associations,我从Flask Mega教程开始学习这些东西。当他进入多对多关系时,他会创建一个如下的关联表: followers = db.Table('followers', db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) ) 当我在寻找添加一些关于模型之间特定关联的元数据的方法时,我发

我从Flask Mega教程开始学习这些东西。当他进入多对多关系时,他会创建一个如下的关联表:

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
当我在寻找添加一些关于模型之间特定关联的元数据的方法时,我发现可以在关联表中存储这类内容。。然而,我发现的这个例子似乎使关联表成为了一个实际的模型

class DepartmentEmployeeLink(Base):
    __tablename__ = 'department_employee_link'
    department_id = Column(Integer, ForeignKey('department.id'), primary_key=True)
    employee_id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
    extra_data = Column(String(256))
    department = relationship(Department, backref=backref("employee_assoc"))
    employee = relationship(Employee, backref=backref("department_assoc"))
这两种方法有什么区别?在关联表中存储元数据需要模型方法,还是可以用top方法完成同样的事情


谢谢

抱歉,我终于在SQLAlchemy文档中找到了答案

…它们明确定义了差异:

多对多在两个类之间添加关联表

关联对象模式是多对多上的一个变体:它被使用 当关联表包含超出这些列的其他列时 它们是左表和右表的外键。而不是使用 在第二个参数中,您可以将一个新类直接映射到 关联表

其中“右”和“左”是表,通常定义为:

class Left(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key = True)
    ...

class Right(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key = True)
    ...

因此,如果需要在关联中存储任何内容,基本上就是创建一个关联对象来引用这些额外信息,否则就不需要使用ORM层,只需创建一个关联表即可

@oski86不客气!理清两者之间的差异对我来说是一个重大的转折点。这都是在对象模式中应用
extra\u data
列!如果不需要绑定到特定模型对的额外数据,那么就不需要关联对象——一个更简单的关联表就足够了@乔科蒙基正在寻找这个。请帮我把这个弄清楚。现在“关联”和其他模型之间是否存在一对多关系?在这种情况下,我们还必须在这些模型中定义关系?“会有很大帮助的。”NewGuy问得好,谢谢你的提问!您发现了我的答案是平淡无奇的,此后我用充实的关系字段对其进行了更新,并添加了一些表定义,以使其更清晰。希望这有帮助!更新的文档链接:@user2682863我今天查过了。文档表明backref在这种情况下是合法使用的,事实上,它最终会调用_填充本身。这是一种简写,当在
关联
对象中的关系定义中使用backref时,它不需要在
左侧
右侧
模型中明确定义关系。有人可能会说显式的更好,但实际上两者都可以。
class Association(Base):
    __tablename__ = 'association'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)

    extra_data = Column(String(50))

    left = relationship('Left', backref=backref('right_association'))
    right = relationship('Right', backref=backref('left_association'))
class Left(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key = True)
    ...

class Right(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key = True)
    ...