Flask-SqlAlchemy 邻接列表关系的 backref 意外错误
我正在做一个小项目,使用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])