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

如何在Django视图中循环Exercise关联的Breakdown外键数据?

Django关联数据获取错误修复方案

错误根源

  1. exercises是Exercise.objects.filter()返回的QuerySet集合,并非单个Exercise实例,无法直接通过.Breakdown访问关联数据,必须先遍历集合中的每个实例。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:05:32