在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
相关产品推荐
相关产品推荐

