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

在Django中外键关联时如何获取关联模型的多个字段值

获取Django外键关联模型的额外字段

我定义了如下两个Django模型:

Attendance 模型

class Attendance(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    date = models.DateField()
    day = models.CharField(max_length=10)
    in_time = models.CharField(max_length=5)
    out_time = models.CharField(max_length=5)

Employee 模型

class Employee(models.Model):
    emp_id = models.CharField(max_length=10,primary_key=True)
    emp_type = models.CharField(max_length=50)
    name = models.CharField(max_length=100)
    epf_no = models.CharField(max_length=10)
    nic_no = models.CharField(max_length=15)
    appoinment_date = models.DateField()
    termination_date = models.DateField()
    address = models.CharField(max_length=50)
    mobile_no = models.CharField(max_length=15)
    email = models.EmailField(max_length=50)
    bank_name = models.CharField(max_length=50)
    bank_branch = models.CharField(max_length=20)
    bank_acc_name = models.CharField(max_length=20)
    bank_acc_no = models.CharField(max_length=15)
    active_status = models.BooleanField(default=True)

我现在用下面的代码从Attendance模型获取数据:

attendance_record = Attendance.objects.filter(date = date).values()

但此时返回的结果里,employee字段只包含emp_id,我还想同时获取员工的name字段,该怎么实现?


给你几种实用的实现方式:

方式一:在values()中直接指定关联字段

通过**双下划线__**关联到Employee模型的字段,在values()里明确列出所有需要的字段:

attendance_record = Attendance.objects.filter(date=date).values(
    # 按需添加Attendance自身的字段
    'date',
    'day',
    'in_time',
    'out_time',
    # 关联Employee的字段
    'employee__emp_id',
    'employee__name'
)

返回的每条数据是类似这样的字典:

{
    'date': datetime.date(2024, 5, 20),
    'day': 'Monday',
    'in_time': '09:00',
    'out_time': '18:00',
    'employee__emp_id': 'E001',
    'employee__name': '张三'
}

方式二:自定义返回的字段名(可选)

如果觉得employee__name这种键名不够直观,可以用F表达式给字段重命名:

from django.db.models import F

attendance_record = Attendance.objects.filter(date=date).annotate(
    emp_id=F('employee__emp_id'),
    emp_name=F('employee__name')
).values(
    'date',
    'day',
    'in_time',
    'out_time',
    'emp_id',
    'emp_name'
)

返回结果的键名会更简洁:

{
    'date': datetime.date(2024, 5, 20),
    'day': 'Monday',
    'in_time': '09:00',
    'out_time': '18:00',
    'emp_id': 'E001',
    'emp_name': '张三'
}

方式三:预加载关联模型优化性能

如果数据量较大,建议先用select_related预加载关联的Employee数据,避免N+1查询的性能问题,再指定需要的字段:

attendance_record = Attendance.objects.filter(date=date).select_related('employee').values(
    'date',
    'day',
    'in_time',
    'out_time',
    'employee__emp_id',
    'employee__name'
)

内容的提问来源于stack exchange,提问作者Chamika Dilshan Happuarachchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:05:22