python - 一对多自引用关系 SQLAlchemy
问题描述
我对python很陌生(不到一天!)。我正在尝试使用 Flask 构建一个 Restful API。我有class TaskModel(db.Model):
一个与任务有自引用关系的类。实际上,一个任务可以有很多前辈(dependsOn 字段)。
但是当我添加下面的关系时,我得到了这个错误:
sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship TaskModel.dependsOn - there are no foreign keys linking these tables.
我的整个任务课程如下:
class TaskModel(db.Model):
"""
Task Model
"""
# table name
__tablename__ = 'tasks'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), nullable=False)
department = db.Column(db.String(128), nullable=False)
earliestStart = db.Column(db.String(10), nullable=False)
latestEnd = db.Column(db.String(10), nullable=False)
duration = db.Column(db.String(10), nullable=False)
dnetworkId = db.Column(db.Integer, db.ForeignKey('dnetworks.id'), nullable=False)
dependsOn = db.relationship('TaskModel', backref='tasks',remote_side=[id], lazy=True)
....
class TaskSchema(Schema):
"""
Task Schema
"""
id = fields.Int(dump_only=True)
name = fields.Str(required=True)
department = fields.Str(required=True)
earliestStart = fields.Str(required=True)
latestEnd = fields.Str(required=True)
dnetworkId = fields.Int(required=True)
duration = fields.Str(required=True)
dependsOn = fields.Nested('self', many=True, exclude=('dependsOn',))
# dependsOn = fields.Nested('self', exclude=('dependsOn',), default=None, many=True)
提前致谢 :)
解决方案
在关系的 SqlAlchemy 中,您应该定义两种方式,以下是您可能正在寻找的完整工作示例:
import os
from sqlalchemy.orm import relationship, backref
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////{}/my.db'.format(BASE_DIR)
db = SQLAlchemy(app)
class TaskModel(db.Model):
__tablename__ = 'tasks'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), nullable=True)
parent_id = db.Column(db.Integer, db.ForeignKey("tasks.id"))
children = relationship("TaskModel",
backref=backref('parent', remote_side=[id])
)
if __name__ == "__main__":
db.create_all()
tm = TaskModel(name='Test1')
db.session.add(tm)
db.session.commit()
注意 parent_id 和 children,这两者的组合将为您提供所需的东西,任务上的自我关系,数据库上的 parent_id 将添加到您的表中。
推荐阅读
- c# - C# 中的异常处理,用于处理 powershell 脚本中的错误
- python - 输入 0 与 flatten_15 层不兼容:预期 min_ndim=3,发现 ndim=2
- angularjs - 如何在输入框中将 ng-model 属性传递给 ng-class 中的函数(以设置 CSS 属性)
- apache - 编译 Mod_JK 1.2.46 时出现问题
- hive - Hive Vertex 失败,在 EMR 上运行大文件时 vertexName=Map 2
- java - java.lang.RuntimeException: Parcelable遇到IOException写可序列化对象如何解决
- android - 使用 NFC 的 iPhone 到 iPhone 数据传输
- angularjs - 在 Facebook、Twitter 和 Pinterest 上分享网址
- mysql - SQL join 只匹配最大值
- javascript - jQuery:JS警报无序触发