Flask-SqlAlchemy 邻接列表关系的 backref 意外错误

6 投票
1 回答
2124 浏览
提问于 2025-04-17 17:08

我正在做一个小项目,使用Flask-SqlAlchemy来实现一个邻接列表关系。我有一个模型(表),里面有一个属性是db.Relationship(),它引用了同一个表的parent_id列。

下面是部分代码:

class Node(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(80))
    folder_id = db.Column(db.Integer, db.ForeignKey('node.id'))

    children = db.relationship('Node', backref = 'parent', remote_side=[id])

当我尝试在Python Shell中使用子项的backref属性将一个子文件夹添加到父文件夹时,代码如下(部分):

parentNode = Node('title1')
db.session.add(parent)
db.session.commit()

childNode = Node('title2')
child.parent = parentNode

但是,当我在Python Shell中尝试这样做时,出现了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

TypeError: Incompatible collection type: Node is not list-like

我查阅了SqlAlchemy的文档,想找到解决方案,里面有类似的邻接列表关系的语法。虽然有类似的例子,但没有展示如何像我在Shell中尝试的那样将父节点添加到子节点。这是因为将父节点添加到子节点的backref属性是为了处理一对多的关系。如果有人能帮我找出代码中的问题,我将非常感激……也欢迎提出其他解决方案。

谢谢!

1 个回答

7

你配置的关系方式不对。请按照下面的方式来做:

from sqlalchemy.orm import backref
class Node(db.Model):
    # ...
    children = db.relationship('Node', backref=backref('parent', remote_side=[id]))

或者

class Node(db.Model):
    # ...
    parent = db.relationship("Node", backref='children', remote_side=[id])

撰写回答