【问题标题】:Flask-SqlAlchemy Adjacency List Relationship backfref unexpected errorFlask-SqlAlchemy 邻接列表关系 backfref 意外错误
【发布时间】:2013-02-11 11:25:04
【问题描述】:

我正在做一个小项目,我正在使用 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 属性中的原因是它适用于一对多关系。非常感谢您找到代码问题的任何帮助......请随时提出替代解决方案。

谢谢!

【问题讨论】:

    标签: python orm sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    您以错误的方式配置关系。请这样做:

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

    【讨论】:

    • 范,感谢您提供 sn-p 并指出问题。我只是按照您刚刚展示的方式配置了关系,猜猜看,它完全按照我的预期工作!非常感谢...非常感谢您的及时帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2017-05-24
    • 2016-07-11
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2020-04-15
    • 2019-10-01
    相关资源
    最近更新 更多