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

时间:2013-02-26 05:16:05

标签: python orm sqlalchemy flask flask-sqlalchemy

我正在开发一个小项目,我正在使用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 个答案:

答案 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])