如何在Django视图中循环Exercise关联的Breakdown外键数据?
Django关联数据获取错误修复方案
错误根源
exercises是Exercise.objects.filter()返回的QuerySet集合,并非单个Exercise实例,无法直接通过.Breakdown访问关联数据,必须先遍历集合中的每个实例。- Breakdown模型中定义的
related_name为breakdowns,需使用该名称访问关联数据,而非模型名Breakdown。
正确实现方式
视图内循环处理数据
修改get_context_data方法,遍历每个Exercise实例后,通过指定的关联名获取对应的Breakdown数据:
class page_details(DetailView): model = Workout template_name = 'app/page.html' context_object_name = 'workout' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 获取当前Workout关联的所有Exercise exercises = Exercise.objects.filter(workout_id=self.object) # 逐个遍历Exercise,获取对应的Breakdown集合 for exercise in exercises: # 利用related_name定义的breakdowns获取关联数据 for breakdown in exercise.breakdowns.all(): print(breakdown) # 将exercises传入模板,供前端渲染使用 context['exercises'] = exercises return context
模板中直接渲染关联数据
若需在模板展示数据,无需在视图提前处理,直接通过关联名遍历即可,Django会自动执行关联查询:
{% for exercise in exercises %} <h4>{{ exercise.name }}</h4> <div> {% for breakdown in exercise.breakdowns.all %} <p>{{ breakdown.你的字段名 }}</p> {% empty %} <p>暂无分解数据</p> {% endfor %} </div> {% endfor %}
性能优化(可选)
为避免N+1查询问题,可在获取Exercise时提前预加载关联的Breakdown数据:
exercises = Exercise.objects.filter(workout_id=self.object).prefetch_related('breakdowns')
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

