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

Django如何构建QuerySet实现多层级关联对象分组并渲染模板

需求目标

在模板中按指定层级结构展示计划数据,目标展示结构如下:

PLan 1: ABC
 - General Objective 1
     - Sub-Objective-1
       - Task 1
       - Task 2
     - Sub-Objective-2
       - Task 1
PLan 2: ZZZ
 - General Objetivo General 1
     - Sub-Objetivo-1
       - Tarea 1
PLan 3: DDD
 - General Objetivo General 1
     - Sub-Objetivo-1
       - Tarea 1
     - Sub-Objetivo-2
       - Tarea 1
数据层级规则
  • 1个ActionPlan(计划)可包含多个PlanObjective(总目标)
  • 1个PlanObjective(总目标)可包含多个PlanSubObjective(子目标)
  • 1个PlanSubObjective(子目标)可关联多个PlanSubObjectiveTask(任务)
现有模型代码
class PlanObjective(models.Model):
    actionplan = models.ForeignKey(ActionPlan, on_delete=models.CASCADE)
    center = models.ForeignKey(Center, on_delete=models.CASCADE)
    centerobjective = models.ForeignKey(CenterObjective, null=True, on_delete=models.SET_NULL)
    description = models.TextField(max_length=250, null=False, default='')

class PlanSubObjective (models.Model):
    actionplan = models.ForeignKey(ActionPlan, on_delete=models.CASCADE)
    center = models.ForeignKey(Center, on_delete=models.CASCADE)
    planobjective = models.ForeignKey(PlanObjective, on_delete=models.CASCADE)
    description = models.TextField(max_length=250, null=False, default='')


class PlanSubObjectiveTask (models.Model):
    actionplan = models.ForeignKey(ActionPlan, on_delete=models.CASCADE)
    center = models.ForeignKey(Center, on_delete=models.CASCADE)
    planobjective = models.ForeignKey(PlanObjective, on_delete=models.CASCADE)
    plansubobjective = models.ForeignKey(PlanSubObjective, on_delete=models.CASCADE)
    is_complete = models.CharField(max_length=2, null=True, blank=True, default='0')
当前实现问题

现有查询语句从任务表出发查询:

plans = PlanSubObjectiveTask.objects.filter(period=period).select_related(
        'plansubobjective', 'planobjective', 'actionplan')

尝试使用Django内置的regroup模板标签实现多层分组,但未得到预期效果,需要更合理的QuerySet构建方案实现上述层级数据展示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:48:42