Python Flask 任务表设计:添加子任务和孙任务,获取任意级任务
使用递归的方式来获取某个任务的最高级任务或任意一级的任务。首先,我们可以设计一个任务表的数据模型,使用 SQLAlchemy 来进行数据库操作。以下是一个示例的任务表设计:
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
db = SQLAlchemy(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
parent_id = db.Column(db.Integer, db.ForeignKey('task.id'))
children = db.relationship('Task', cascade='all', backref=db.backref('parent', remote_side=[id]))
def get_top_level_task(self):
if self.parent:
return self.parent.get_top_level_task()
else:
return self
def get_level_task(self, level):
if level == 0:
return self
elif self.parent:
return self.parent.get_level_task(level - 1)
else:
return None
db.create_all()
在上面的代码中,我们定义了一个 Task 模型,包含 id、name 和 parent_id 三个属性,其中 parent_id 是一个外键,用于表示父任务的 id。children 是一个关系字段,用于表示当前任务的子任务。get_top_level_task 方法可以获取当前任务的最高级任务,通过递归地向上查询父任务,直到找到最顶层的任务。get_level_task 方法可以获取当前任务的指定级别的任务,通过递归地向上查询父任务,直到找到指定级别的任务。
接下来,我们可以使用 Flask 的路由来操作任务表:
@app.route('/tasks', methods=['POST'])
def add_task():
data = request.json
parent_id = data.get('parent_id')
name = data.get('name')
parent_task = Task.query.get(parent_id) if parent_id else None
task = Task(name=name, parent=parent_task)
db.session.add(task)
db.session.commit()
return jsonify({'message': 'Task added successfully'})
@app.route('/tasks/<int:task_id>/top-level-task', methods=['GET'])
def get_top_level_task(task_id):
task = Task.query.get(task_id)
top_level_task = task.get_top_level_task()
if top_level_task:
return jsonify({'top_level_task': top_level_task.name})
else:
return jsonify({'message': 'Task not found'})
@app.route('/tasks/<int:task_id>/level-task/<int:level>', methods=['GET'])
def get_level_task(task_id, level):
task = Task.query.get(task_id)
level_task = task.get_level_task(level)
if level_task:
return jsonify({'level_task': level_task.name})
else:
return jsonify({'message': 'Task not found'})
上面的代码中,add_task 函数用于添加任务,接收一个 JSON 格式的请求体,包含 parent_id 和 name 两个字段,parent_id 表示父任务的 id,name 表示任务名称。首先根据 parent_id 查询父任务,然后创建新的任务,并将其与父任务关联。最后将任务添加到数据库中。
get_top_level_task 函数用于获取指定任务的最高级任务,接收一个任务的 id 作为参数。首先根据 task_id 查询任务,然后调用 get_top_level_task 方法获取最高级任务,并返回其名称。
get_level_task 函数用于获取指定任务的指定级别任务,接收一个任务的 id 和级别作为参数。首先根据 task_id 查询任务,然后调用 get_level_task 方法获取指定级别任务,并返回其名称。
使用上述代码,你可以通过发送 HTTP 请求来添加任务,以及获取任务的最高级任务和任意一级任务。例如:
# 添加任务
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Task 1"}' http://localhost:5000/tasks
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Task 2", "parent_id": 1}' http://localhost:5000/tasks
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Task 3", "parent_id": 2}' http://localhost:5000/tasks
# 获取任务的最高级任务
$ curl http://localhost:5000/tasks/3/top-level-task
# 获取任务的指定级别任务
$ curl http://localhost:5000/tasks/3/level-task/1
以上示例中,我们通过发送 HTTP 请求来添加了三个任务,然后分别获取了任务 3 的最高级任务和一级任务。
原文地址: https://www.cveoy.top/t/topic/peQV 著作权归作者所有。请勿转载和采集!