Django用递归实现查询所有子部门逻辑

发布时间 2023-05-16 16:53:40作者: 史可轩

假设你已经定义好了部门模型 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 表示部门的上级部门,是一个自关联的外键。

现在,我们可以使用递归函数来实现查找指定一级部门下的所有子部门:

def get_sub_departments(department_name):
    try:
        # 获取一级部门
        department = Department.objects.get(name=department_name)
    except Department.DoesNotExist:
        return []

    sub_departments = []

    # 递归查找子部门
    def _get_sub_departments(department):
        # 获取当前部门的子部门
        departments = Department.objects.filter(parent_department=department)
        for sub_department in departments:
            sub_departments.append(sub_department)
            _get_sub_departments(sub_department)

    _get_sub_departments(department)

    return sub_departments

上面的代码首先通过指定的一级部门名称查找一级部门对象,然后定义了一个空列表 sub_departments,用于存储所有子部门对象。接着,我们定义了一个递归函数 _get_sub_departments,该函数用于递归查找当前部门的所有子部门。在函数中,我们首先通过当前部门查询所有子部门,并依次遍历每个子部门,将其添加到 sub_departments 列表中,并递归调用 _get_sub_departments 函数查找当前部门的子部门的子部门,直到所有子部门都被查找完毕。最后,我们返回 sub_departments 列表,其中包含了指定一级部门下的所有子部门对象。

你可以在 Django 项目中调用 get_sub_departments 函数,传入指定的一级部门名称,即可获取到该部门下的所有子部门对象列表。