Django ForeignKey字段匹配查询返回空QuerySet问题
问题原因
你的查询返回空结果核心是两个低级错误:
- URL里传递的
manager参数是字符串类型,不是Manager模型实例。你在attendance视图里从POST取到的manager是前端传的字符串值,跳转路由时直接把这个字符串传给了mark_attendance,用字符串去匹配Employee的外键字段自然匹配不到任何数据,你之前print觉得输出正确,只是打印了字符串本身,不是模型对象。 - 你用了
Employee.objects.get()查询员工,get()设计上只会返回单条匹配记录,一个管理者本来对应多个员工,就算参数传对了,这里也会抛出MultipleObjectsReturned异常,查询多条记录本来就该用filter()。
修复方案
- 先确认前端attendance页面的表单中,manager选项的value值绑定的是
Manager模型的主键id,不要用name字段或者你处理过的带下划线的select_name,避免重名导致匹配错误。 - 在
mark_attendance视图中,先拿URL传入的字符串id查询出对应的Manager实例,再用这个实例作为条件筛选员工,同时把get()换成filter()。 - 修复代码里其他附带的逻辑错误。
修正后的mark_attendance视图代码如下:
from django.utils import timezone @login_required def mark_attendance(request, manager): # 将URL传入的字符串主键转换为Manager模型实例 manager_instance = Manager.objects.get(id=manager) # filter返回对应管理者下的所有员工列表 employee_list = Employee.objects.filter(manager=manager_instance) if request.method == "POST": for employee in employee_list: decision = request.POST.get(f'decision_{employee.pk}') # 用timezone.now()取当前时间,符合Django时区配置逻辑 attendance_record = Attendance( employee=employee, date=timezone.now().date(), status=decision ) attendance_record.save() # 重定向时带上manager参数,避免路由参数缺失报错 return redirect('mark_attendance', manager=manager) return render(request, 'mark_attendance.html', { "employee_list": employee_list, })
其他需要同步修复的代码问题
attendance视图中now = timezone.now().date缺少调用括号,正确写法是now = timezone.now().date(),否则传给模板的是方法对象,不是实际日期值。Employee模型中employee_id字段的primary_key参数传了字符串'True',规范写法是传布尔值True,即employee_id = models.CharField(primary_key=True, max_length=100)。Attendance模型的__str__方法逻辑错误,self.employee本身就是关联的Employee实例,不需要额外查库,正确写法:def __str__(self): return self.employee.name- 不要用
HttpResponseRedirect直接写相对路径跳转,统一用redirect()配合路由名传参,避免URL拼接错误。
内容的提问来源于stack exchange,提问作者Skippy
相关产品推荐
相关产品推荐

