我正在开发一个小项目,我正在使用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属性的原因是它适用于一对多关系。任何帮助找到代码的问题将不胜感激...请随时建议替代解决方案。
谢谢!
答案 0 :(得分:5)
您以错误的方式配置关系。请这样做:
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])