【发布时间】:2019-08-31 17:30:33
【问题描述】:
我正在尝试使用 SQLAlchemy 在 Flask 应用程序中建立自引用的一对多关系。
from app import db
[...]
class Task(db.Model):
__tablename__ = 'tasks'
id = db.Column(db.Integer, primary_key=True)
[...]
parent_id = db.Column(db.Integer, db.ForeignKey('tasks.id'))
children = db.relationship("Task", backref='parent',
remote_side=[id])
我正在尝试在 SQLAlchemy 教程的邻接列表关系中实现类似于 this page 中的示例。每个任务节点可能有许多子节点,而父节点只有一个。
这种关系现在正在发挥作用,但与我原本的意图相反。 parent_id 为 1 的任务将列出 id = 1 的任务作为其子任务。同样,Task.parent 返回一个列表。
迁移工具 Alembic 将上述代码编码如下:
op.add_column('tasks', sa.Column('parent_id', sa.Integer(), nullable=True))
op.create_foreign_key(None, 'tasks', 'tasks', ['parent_id'], ['id'])
我的假设是我为上面没有的 remote_side 声明提供了错误的语法。不幸的是,自我参照关系每次都让我感到困惑,我无法理解这是如何工作的。任何帮助或指点将不胜感激。
【问题讨论】:
-
我不熟悉你使用的所有模块,所以我不会把完整的答案放在一起。我认为你最好给每个任务自己的父级,所以将
children切换到parent。基本上,当你创建一个新任务时,你不是说“这里有 n 个孩子”,而是说“任务的父级是 x”。然后,您可以使用parent.id = 1找到所有任务。如果您现在转换“父母”和“孩子”这两个词的心态,它实际上可能会按预期工作。Task.parent返回一个列表,也就是一个子列表,对吧? -
感谢您的指点。我确实想知道这是否可能是我转变心态的问题。不过,最后,下面的答案就我正在寻找的东西而言。
标签: python sqlalchemy