You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用select_related获取Employee模型关联User的first_name和last_name?

如何用select_related获取Employee关联User的first_name和last_name?

嘿,我来帮你搞定这个问题!你其实是在访问关联模型字段的写法上踩了个小坑,咱们一步步来修正:

首先先回顾下你的Employee模型定义:

class Employee(models.Model):
    """存储员工基本信息的模型"""
    user = models.OneToOneField(User, related_name='users', on_delete=models.CASCADE, unique=True)
    photo_logo = models.FileField(null=True, blank=True)

你原来的查询代码里,values('user_first_name','user_last_name','id')的写法是错误的——Django中要访问关联模型的字段,得用**双下划线__**来关联模型名和字段名,而不是单下划线拼接。

正确的查询写法有两种:

  • 如果你需要返回字典形式的结果,修正values()里的字段名即可:
emp = Employee.objects.filter(pk=1).select_related('user').values('id', 'user__first_name', 'user__last_name')

这里user__first_name就表示取Employee关联的User模型的first_name字段,user__last_name同理,select_related('user')也能确保只执行一次SQL查询,避免N+1问题。

  • 如果你需要获取模型对象来直接访问属性,也可以这么写:
emp_obj = Employee.objects.filter(pk=1).select_related('user').first()
if emp_obj:
    emp_id = emp_obj.id
    first_name = emp_obj.user.first_name
    last_name = emp_obj.user.last_name

这种方式更直观,适合后续需要用对象属性做其他操作的场景。

另外提一句:你设置的related_name='users'是给反向关联用的(也就是从User模型访问Employee时用user.users),咱们这次是正向从Employee查User,所以不需要用到这个参数,直接用关联字段名user就好。

内容的提问来源于stack exchange,提问作者Philip Mutua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:41:11