Django模板中如何调用OneToOneField反向关联获取User表字段
Django模板获取OneToOneField关联User模型的first_name字段方案
问题根源
你在视图中调用了.values()方法查询UserInfo,返回的结果是字典格式,不是UserInfo模型实例,无法通过ORM关联特性访问关联的User对象字段。
另外补充说明:你定义的related_name="parent_user"是给User对象反向查询对应UserInfo用的,语法为某User实例.parent_user,当前你需要从UserInfo取关联User,属于正向关联,直接用user属性即可。
解决方案1(推荐):修改视图,传入模型实例
该方案写法最简单,还可通过select_related提前联表查询避免N+1性能问题:
修改视图代码
start = 18 end =25 # 去掉.values(),加select_related提前加载关联User数据 matching = UserInfo.objects.filter( age__gte=start, age__lte=end ).select_related('user') for z in matching: # 换成取实例的user id判断 if z.user.id not in rec_ids: profiles.append(z) context = { 'profiles' : profiles, } return render(request, 'home/news.html', context)
修改模板对应位置
直接通过正向关联取first_name:
User First Name is : {{ p.user.first_name }}
解决方案2:保留.values()写法,主动查询关联字段
如果一定要用字典格式返回,需要在调用values时主动声明要取的关联字段:
修改视图查询语句
matching = UserInfo.objects.filter( age__gte=start, age__lte=end ).values('id', 'user_id', 'image', 'age', 'bio', 'user__first_name') # 新增关联字段
修改模板对应位置
User First Name is : {{ p.user__first_name }}
内容的提问来源于stack exchange,提问作者Rahul Negi
相关产品推荐
相关产品推荐

