如何在Django中使用prefetch_related获取关联模型的最新职位数据
方案1:新增模型属性(简单易维护,适合中小数据量)
你已经在EmployeePosition的Meta配置中指定了get_latest_by = 'effective_date',可以直接调用latest()方法获取生效日期最晚的记录。
首先在Employee模型中新增只读属性:
@property def latest_position(self): # 先判断是否存在职位记录,避免空值报错 if self.employee_position.exists(): return self.employee_position.latest().position return "无职位记录"
然后修改模板代码,删除职位列的循环逻辑,直接调用该属性即可:
{% for emp in employee_list %} <tr> <td>{{ emp.user.id }}</td> <td><a href="{% url 'corehr:profile' emp.slug %}">{{ emp.get_full_name }}</a></td> <td>{{ emp.user.email }}</td> <td>{{ emp.phone_number }}</td> <td>{{ emp.hire_date|date:"M d, Y" }}</td> <!-- 替换原有循环,直接取最新职位 --> <td>{{ emp.latest_position }}</td> </tr> {% endfor %}
方案2:优化查询性能(适合大数据量场景,减少数据库查询次数)
如果员工数量较多,方案1每次调用latest_position都会产生额外的数据库查询,可以在视图层用Prefetch自定义预加载规则,一次性查出所有员工的最新职位:
修改视图的get_queryset方法:
from django.db.models import Prefetch, Max def get_queryset(self): # 预筛选每个员工对应的最新职位记录 latest_positions = EmployeePosition.objects.filter( id__in=EmployeePosition.objects.values('employee_id').annotate( latest_effective=Max('effective_date') ).values('id') ) # 自定义预加载规则,仅加载最新的职位数据 return Employee.objects.prefetch_related( Prefetch('employee_position', queryset=latest_positions, to_attr='latest_pos') ).all()
模板中直接调用预加载的结果即可:
<td>{{ emp.latest_pos.0.position|default:"无职位记录" }}</td>
内容的提问来源于stack exchange,提问作者John Todorovic
相关产品推荐
相关产品推荐

