Django通过ManyToMany字段获取User模型完整信息的问题
Django多对多关联获取User模型字段实现方法
school.user.all返回的是当前学校关联的所有用户对象组成的QuerySet,直接渲染该QuerySet只会调用模型的__str__方法(默认返回username),无法直接输出其他字段,按以下两种方式实现即可:
模板层直接遍历(快速实现)
对关联用户的QuerySet做嵌套循环,即可访问每个用户实例的所有字段,修改模板代码如下:{% for school in school %} <tr> <td>{{school.name}}</td> <td> {% for user_obj in school.user.all %} <span>{{ user_obj.first_name }} {{ user_obj.last_name }}</span> <!-- 同模型下其他字段可直接通过点语法获取,比如{{ user_obj.email }} --> {% empty %} 暂无关联用户 {% endfor %} </td> </tr> {% endfor %}其中
{% empty %}是循环标签的配套语法,当没有关联用户时会展示对应提示内容。视图层优化(数据量大时推荐)
如果关联用户数量较多,直接在模板里遍历会产生N+1数据库查询问题,建议在视图查询时提前预加载关联数据,修改views.py逻辑:def schools(request, pk): event = Event.objects.get(id=pk) # prefetch_related会一次性批量查询所有关联学校的用户数据,大幅减少数据库查询次数 school = School.objects.filter(event=event).prefetch_related('user') return render(request, 'accounts/schools.html', {'event':event, 'school':school})预加载完成后,模板层的遍历写法和上面完全一致,不需要额外改动。
小提示:如果需要对关联用户做排序、筛选,可以在视图中使用
Prefetch对象自定义关联查询的逻辑,满足更复杂的展示需求。
内容的提问来源于stack exchange,提问作者Matt Schucker
相关产品推荐
相关产品推荐

