Django用递归实现查询所有部门以及子部门 树状结构

发布时间 2023-05-16 16:58:42作者: 史可轩

假设你已经定义好了部门模型 Department,该模型包含以下字段:

class Department(models.Model):
    name = models.CharField(max_length=100)
    parent_department = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)

其中,name 表示部门名称,parent_department 表示部门的上级部门,是一个自关联的外键。

现在,我们可以使用递归函数来实现获取所有部门并以树状结构 JSON 展示:

from django.http import JsonResponse

def get_departments():
    # 获取所有的部门
    departments = Department.objects.all()

    # 定义递归函数,获取部门的子部门
    def get_children(department):
        children = []
        sub_departments = department.department_set.all()
        for sub_department in sub_departments:
            children.append({
                'id': sub_department.id,
                'name': sub_department.name,
                'children': get_children(sub_department)
            })
        return children

    # 构造树状结构
    tree = []
    for department in departments.filter(parent_department=None):
        tree.append({
            'id': department.id,
            'name': department.name,
            'children': get_children(department)
        })

    # 返回 JSON 格式的数据
    return JsonResponse(tree, safe=False)

上面的代码首先通过 Department.objects.all() 获取所有的部门对象。然后,我们定义了一个递归函数 get_children,该函数用于获取指定部门对象的子部门,并返回以子部门为根节点的树状结构。在函数中,我们首先通过 department.department_set.all() 获取当前部门的所有子部门对象,然后依次遍历每个子部门,并递归调用 get_children 函数获取该子部门的子部门树状结构,并将其添加到 children 列表中。最后,我们返回 children 列表,其中包含了指定部门的所有子部门树状结构。

接下来,我们在 get_departments 函数中构造整个部门树的树状结构。具体来说,我们首先通过 departments.filter(parent_department=None) 获取所有顶级部门对象,然后依次遍历每个顶级部门,通过调用 get_children 函数获取其子部门树状结构,并将其添加到 tree 列表中。最后,我们将 tree 列表返回为 JSON 格式的数据。

你可以在 Django 项目中调用 get_departments 函数,即可获取到所有部门的树状结构 JSON 数据。