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

