Fastapi + vue3 自动化测试平台(5)-- 封装树形结构列表生成器
使用FastAPI封装树形结构生成函数:高效处理层级数据
在Web开发中,树形结构是一种常见的数据组织形式,常用于菜单、分类、组织结构等场景。本文将介绍如何使用FastAPI封装一个通用的树形结构生成函数,支持动态选择字段,并递归构建树形数据。
需求分析
我们需要实现一个函数,能够根据给定的模型和父节点ID,递归生成树形结构。同时,支持动态选择需要返回的字段,以满足不同场景的需求。
实现思路
- 递归查询:从根节点(
pid=0
)开始,逐层查询子节点。 - 动态字段选择:通过
fields
参数指定需要返回的字段。 - 树形结构构建:将查询到的节点数据组织成树形结构。
代码实现
以下是基于FastAPI和Tortoise ORM的实现代码:
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
from tortoise.models import Model
from tortoise import fields
app = FastAPI()
# 示例模型
class Category(Model):
id = fields.IntField(pk=True)
name = fields.CharField(max_length=255)
pid = fields.IntField(default=0) # 父节点ID
# 树形结构生成函数
async def create_tree(model, pid: int = 0, fields: list = None):
"""
获取树形结构,支持动态选择字段
:param model: 数据模型
:param pid: 父节点ID
:param fields: 需要返回的字段列表
:return: 树形结构列表
"""
# 查询当前层级的节点
nodes = await model.filter(pid=pid).values(*fields)
tree = []
for node in nodes:
# 当前节点的数据字典
node_data = {field: node[field] for field in fields}
# 递归查找子节点
children = await create_tree(model, pid=node['id'], fields=fields)
if children:
node_data['children'] = children
tree.append(node_data)
return tree
# FastAPI路由示例
@app.get("/tree")
async def get_tree():
fields = ["id", "name"] # 动态选择字段
tree = await create_tree(Category, pid=0, fields=fields)
return {"tree": tree}
# 数据库初始化
register_tortoise(
app,
db_url="sqlite://:memory:",
modules={"models": ["__main__"]},
generate_schemas=True,
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
代码解析
-
模型定义:
Category
是一个简单的分类模型,包含id
、name
和pid
字段。pid
表示父节点ID,根节点的pid
为0。
-
create_tree
函数:- 通过
model.filter(pid=pid).values(*fields)
查询当前层级的节点。 - 使用递归调用
create_tree
获取子节点,并将结果添加到children
字段中。 - 返回完整的树形结构。
- 通过
-
FastAPI路由:
/tree
接口调用create_tree
函数,返回生成的树形结构。
-
数据库初始化:
- 使用
register_tortoise
初始化数据库,并自动生成表结构。
- 使用
使用示例
启动FastAPI服务后,访问/tree
接口,将返回如下格式的树形结构:
{
"tree": [
{
"id": 1,
"name": "Root",
"children": [
{
"id": 2,
"name": "Child 1",
"children": []
},
{
"id": 3,
"name": "Child 2",
"children": []
}
]
}
]
}
前端代码
const defaultProps = {
children: "children",
label: "name"
};
<el-tree
ref="step_treeRef"
:data="树结构"
:props="defaultProps"
default-expand-all
>
</tree>
总结
通过封装create_tree
函数,我们可以轻松生成树形结构,并支持动态选择字段。这种方法适用于各种层级数据的场景,如菜单、分类、组织结构等。结合FastAPI和Tortoise ORM,能够快速构建高效的Web服务。
希望本文对你有所帮助!如果有任何问题或建议,欢迎在评论区交流讨论。🚀