You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自引用模型的组织结构图生成代码改写为递归函数?

递归版本的多层组织结构图生成方案

没问题,我来帮你把这段代码改成递归版本,这样不管你的组织结构有多少层,都能完美生成完整的层级图!

核心递归实现

首先我们写一个递归辅助函数,它会接收一个Person对象,然后递归构建这个人及其所有下属的层级结构:

def build_org_chart(person):
    # 初始化当前人员的下属结构字典
    sub_chart = {}
    # 获取当前人员的直接下属
    direct_reports = Person.objects.filter(reports_to=person)
    # 遍历每个直接下属,递归构建他们的下属结构
    for report in direct_reports:
        sub_chart[report] = build_org_chart(report)
    # 如果没有下属,返回空字典(也可以根据需求返回None或其他值)
    return sub_chart

# 生成完整的组织结构图
top_level = Person.objects.filter(reports_to=None)
org_chart = {}
for leader in top_level:
    org_chart[leader] = build_org_chart(leader)

代码工作原理

  • 递归函数build_org_chart会先处理当前人员的直接下属,然后对每个下属重复调用自身,去构建下属的下属结构,直到某个人员没有下属时,返回空字典终止递归。
  • 顶层逻辑和你原来的代码类似:先找到所有没有上级的顶层人员,然后为每个顶层人员生成完整的下属树。

性能优化建议(可选)

如果你团队人员较多,上面的实现会产生N+1次数据库查询(每个人员都要查一次下属),可以先一次性把所有人员数据拉取到内存,再构建结构,大幅减少数据库交互:

# 一次性获取所有人员,减少数据库查询次数
all_people = Person.objects.all()

# 预构建一个映射:key是上级人员(或None对应顶层),value是直接下属列表
manager_to_reports = {}
for person in all_people:
    manager = person.reports_to
    if manager not in manager_to_reports:
        manager_to_reports[manager] = []
    manager_to_reports[manager].append(person)

# 修改递归函数,使用内存中的映射数据
def build_org_chart(person):
    sub_chart = {}
    # 从预构建的映射中取当前人员的下属
    for report in manager_to_reports.get(person, []):
        sub_chart[report] = build_org_chart(report)
    return sub_chart

# 生成组织结构图
top_level_leaders = manager_to_reports.get(None, [])
org_chart = {leader: build_org_chart(leader) for leader in top_level_leaders}

这个优化版本只需要1次数据库查询,在人员规模大的时候性能提升非常明显。

内容的提问来源于stack exchange,提问作者hookedonwinter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:14:19