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

Django如何在同一HTML表格中展示两个关联模型的数据

实现方法

第一步:优化视图查询逻辑

为了避免模板渲染时出现N+1次数据库查询的性能问题,先修改views.py中的student_list函数,预取关联的录取数据:

def student_list(request):
    # 用prefetch_related预取关联的StudentAdmission数据,减少数据库查询次数
    students = StudentInfo.objects.all().order_by('-id').prefetch_related('studentadmission_set')
    data = {
        "students": students,
    }
    return render(request, "students/student_list.html", data)

第二步:修改HTML模板,渲染关联字段

因为外键字段student_name定义在StudentAdmission模型中,Django会自动为StudentInfo生成反向关联查询集属性studentadmission_set。如果每个学生仅对应一条录取记录,直接取查询集的第一条即可读取关联的班级、分区字段,修改模板对应位置代码:

{% if students %}
    {% for student in students %}
        <tr>
            <td>
              #0021
            </td>
            <td class="text-center">
                {% if student.photo %}
                    <img src="{{ student.photo.url }}" alt="student">
                {% else %}
                    <img src="{% static 'img/default-pic.png' %}" alt="student">
                {% endif %}
            </td>
            <td>{{student.firstname}}</td>
            <td>{{student.gender}}</td>
            <!-- 替换为关联的class_name字段,加default过滤器避免无数据时报错 -->
            <td>{{ student.studentadmission_set.first.class_name|default:"未分配" }}</td>
            <!-- 替换为关联的section_name字段 -->
            <td>{{ student.studentadmission_set.first.section_name|default:"未分配" }}</td>
            <td>Jack Sparrow </td>
            <td>{{student.address}}</td>
            <td>{{student.dob}}</td>
            <td>{{student.phone}}</td>
            <td>{{student.email}}</td>
            
        </tr>
    {% endfor %}
{% endif %}

可选优化(更符合业务逻辑)

如果你的业务规则是一个学生仅对应唯一一条录取记录,建议将StudentAdmission模型中的student_name字段从ForeignKey改为OneToOneField:

# 修改models.py中StudentAdmission的student_name字段定义
student_name = models.OneToOneField(StudentInfo, on_delete=models.CASCADE)

修改后模板中可以直接用更简洁的语法读取关联字段:

<td>{{ student.studentadmission.class_name|default:"未分配" }}</td>
<td>{{ student.studentadmission.section_name|default:"未分配" }}</td>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:30:05