Django外键关联模型筛选:如何在模板中按类别展示对应入学要求
Django外键关联模型按类别筛选展示解决方案
1. 模型外键配置确认
首先确保AdmissionRequirement的外键字段定义符合预期,示例配置如下:
# models.py from django.db import models class AdmissionStudent(models.Model): studentlabel = models.CharField(max_length=50, verbose_name="学生类别") # 其余字段省略 class AdmissionRequirement(models.Model): requirementstudent = models.ForeignKey( AdmissionStudent, on_delete=models.CASCADE, related_name="requirements", # 自定义反向关联名,后续模板查询用 verbose_name="所属学生类别" ) requirement_content = models.TextField(verbose_name="入学要求内容") # 其余字段省略
如果未设置related_name参数,Django默认生成的反向关联名为admissionrequirement_set。
2. 视图层传参优化
无需单独传入全量AdmissionRequirement数据,通过AdmissionStudent的反向关联即可查询对应要求,为优化查询性能建议使用prefetch_related提前加载关联数据:
# views.py from django.shortcuts import render from .models import AdmissionStudent def admission_view(request): # 预加载关联的入学要求数据,减少N+1查询问题 student_categories = AdmissionStudent.objects.all().prefetch_related("requirements") return render(request, "Admission.html", {"student_categories": student_categories})
3. 模板层正确实现逻辑
遍历学生类别后通过反向关联读取对应入学要求即可实现匹配效果:
<!-- Admission.html --> {% for category in student_categories %} <div class="student-category"> <h2>{{ category.studentlabel }}</h2> <ul class="requirement-list"> {% for req in category.requirements.all %} <li>{{ req.requirement_content }}</li> {% empty %} <li>暂未公布该类别的入学要求</li> {% endfor %} </ul> </div> {% endfor %}
如果坚持使用已传入的全量AdmissionRequirement数据做筛选,可使用条件判断匹配:
<!-- 仅适用于已传入all_requirements参数的场景 --> {% for category in student_categories %} <div class="student-category"> <h2>{{ category.studentlabel }}</h2> <ul class="requirement-list"> {% for req in all_requirements %} {% if req.requirementstudent.id == category.id %} <li>{{ req.requirement_content }}</li> {% endif %} {% empty %} <li>暂未公布该类别的入学要求</li> {% endfor %} </ul> </div> {% endfor %}
内容的提问来源于stack exchange,提问作者Flababu
相关产品推荐
相关产品推荐

