gpt4 book ai didi

python - 自引用多对多 flask-sqlalchemy

转载 作者:太空狗 更新时间:2023-10-29 21:08:33 27 4
gpt4 key购买 nike

我这辈子都弄不明白为什么这种 self 参照的多对多不快乐:

minor_contains = db.Table(
'minor_contains',
db.Column('parent_id', db.Integer, db.ForeignKey('minors.id'),
primary_key=True),
db.Column('contains_id', db.Integer, db.ForeignKey('minors.id'),
primary_key=True))

class Minor(db.Model):
__tablename__ = 'minors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
...
contains = db.relationship(
"Minor",
secondary=minor_contains,
primaryjoin="id == minor_contains.c.parent_id",
secondaryjoin="id == minor_contains.c.contains_id",
backref="contained_by",
lazy='dynamic')

我已经尝试根据我在 SQLAlchemy 和 Flask-SQLAlchemy 中看到的示例以几种不同的方式对其进行重新处理,但我始终以收到以下错误消息或在某个地方陷入无限循环而告终.

E ArgumentError:对于关系 Minor.contains 上的主要连接条件“minor_contains.parent_id = :parent_id_1”,找不到涉及本地映射外键列的任何简单相等表达式。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或者在连接条件中使用 foreign() 注释进行注释。要允许除“==”以外的比较运算符,可以将关系标记为 viewonly=True。

更新

我真的无法理解错误消息,因为它显示了连接表中的列与其自身进行比较,其中连接条件应该是未成年人表的 PK 与连接表中的 FK 的比较。

我还将添加一个永远挂起的版本。您会看到我一直在修改变量名,只是一遍又一遍地重写它,希望如果我重新尝试一下,我会在第二次或第五次时变得更聪明。

minor_contains = db.Table(
'minor_contains',
db.Column('parent_minor_id', db.Integer, db.ForeignKey('minors.id'),
primary_key=True),
db.Column('contains_minor_id', db.Integer, db.ForeignKey('minors.id'),
primary_key=True))

class Minor(db.Model):
__tablename__ = 'minors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
...
contains = db.relationship(
"Minor",
secondary=minor_contains,
primaryjoin=id==minor_contains.c.parent_minor_id,
secondaryjoin=id==minor_contains.c.contains_minor_id,
backref=db.backref("minor_contains", lazy='dynamic'))

最佳答案

我认为有必要在连接条件中指定模型名称。

contains = db.relationship(
"Minor",
secondary=minor_contains,
primaryjoin="Minor.id == minor_contains.c.parent_id",
secondaryjoin="Minor.id == minor_contains.c.contains_id",
backref=db.backref('minor_contains', lazy='dynamic'),
lazy='dynamic')

我遇到了同样的问题,它解决了这个问题。我在这里找到了一个有用的答案: link

关于python - 自引用多对多 flask-sqlalchemy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com