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
相关产品推荐
相关产品推荐

