UnboundLocalError报错及Django查询shipment_booking表ord字段问题咨询
问题根源
- 循环变量命名与Django模型类名
shipment_booking重名,根据Python作用域规则,函数内只要对某变量赋值会被识别为局部变量,导致第3行shipment_booking.objects.all()调用时,局部变量还未赋值就被引用,直接触发UnboundLocalError报错 - 函数第4行提前执行了
return render(request, 'bkp1.html'),后续POST校验、字段判断逻辑完全无法执行,属于无效死代码 - 业务逻辑存在缺陷:全表遍历校验时,只要第一条记录不符合就直接返回结果,不会校验所有记录
- 字段名不匹配:需求要求校验
ord字段,代码中写的是ords字段,会导致取值错误
修复后代码
def bkp1(request): orderv = "yes" if request.method == 'POST' and 'pbd' in request.POST: # 数据库层直接查询是否存在ord为yes的记录,性能远高于全表遍历 has_valid_order = shipment_booking.objects.filter(ord=orderv).exists() if has_valid_order: return render(request, 'Pre-Budget.html') else: return render(request, 'bkp1.html', {'msg': 'Please Add Order Details'}) # 非POST请求直接返回页面 return render(request, 'bkp1.html')
修改说明
- 调整循环逻辑为数据库
exists()查询,避免变量名与模型类重名,彻底解决UnboundLocalError报错 - 删除开篇多余的return语句,保证业务逻辑正常执行
- 字段名与需求对齐,避免取值错误
- 调整请求判断顺序,非POST请求不需要查询数据库,减少不必要的性能消耗
- 修复原遍历逻辑的缺陷,只要存在符合要求的记录就返回对应页面,否则返回提示
内容的提问来源于stack exchange,提问作者Indranil Saha
相关产品推荐
相关产品推荐

