Flask-SQLAlchemy 给出了example如何创建多对多关系。它是在两个不同的表之间完成的。
是否可以在同一个表上创建多对多关系?例如,一个姐妹可以有很多姐妹,而她也可以有很多姐妹。我努力了:
girl_sister_map = db.Table('girl_sister_map',
db.Column('girl_id',
db.Integer,
db.ForeignKey('girl.id')),
db.Column('sister_id',
db.Integer,
db.ForeignKey('girl.id')))
class Girl(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
sisters = db.relationship('Girl',
secondary=girl_sister_map,
backref=db.backref('othersisters', lazy='dynamic'))
但是当我尝试为女孩添加姐妹时,我得到:
sqlalchemy.exc.AmbigouslyForeignKeysError:无法确定关系 Girl.sisters 上的父/子表之间的联接条件 - 有多个外键路径通过辅助表“girl_sister_map”链接表。指定“foreign_keys”参数,提供应被视为包含从辅助表到每个父表和子表的外键引用的列的列表。
这可能吗?我应该怎样做呢?
你正试图建立一个所谓的邻接表。也就是说,您有一个自身带有外键的表。
在您的具体情况下,它是自引用多对多关系.
SQLAlchemy 中支持这一点,您将通过前面的链接发现这一点。该文档包含几个示例。
基本上,您将需要primaryjoin
and secondaryjoin
确定您希望如何加入表的参数。直接来自文档:
Base = declarative_base()
node_to_node = Table("node_to_node", Base.metadata,
Column("left_node_id", Integer, ForeignKey("node.id"), primary_key=True),
Column("right_node_id", Integer, ForeignKey("node.id"), primary_key=True)
)
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
label = Column(String)
right_nodes = relationship("Node",
secondary=node_to_node,
primaryjoin=id==node_to_node.c.left_node_id,
secondaryjoin=id==node_to_node.c.right_node_id,
backref="left_nodes"
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)