Django独立模型表嵌套for循环字段匹配条件不生效问题求助
问题排查方案
核心故障原因按出现概率从高到低排序:
- 字符串存在隐藏不可见字符
你打印输出仅展示可见内容一致,但是首尾大概率存在空格、制表符、换行符等不可见字符,直接比对会判定为不相等。
验证方式:把你注释的打印语句替换为print(repr(x.EmployeeNoC), repr(y.EmployeeNo)),repr()方法会把隐藏字符转义后输出,你可以直接看到两个字符串的真实内容有没有多余字符。
修复方式:比对时对两个值先去除首尾空白字符:if x.EmployeeNoC.strip() == y.EmployeeNo.strip() - 空值匹配逻辑错误
两个匹配字段均设置了null=True,Python中None == ''判定为False,若其中一个字段为None、另一个为空字符串,即使看起来都是空也会匹配失败。
修复方式:比对前先过滤空值:if x.EmployeeNoC and y.EmployeeNo and x.EmployeeNoC.strip() == y.EmployeeNo.strip() - QuerySet迭代耗尽问题
你把Employees.objects.all()返回的QuerySet放在循环外层,部分Django版本中QuerySet迭代一次后会被耗尽,内层循环第二次及之后运行时取不到任何值。
修复方式:提前把员工QuerySet转为列表存储:queryEmployee = list(Employees.objects.all())
逻辑优化建议
你当前使用嵌套循环时间复杂度为O(n*m),数据量较大时运行效率极低,可优化为字典映射的方式,仅需两次线性遍历即可完成逻辑:
# 生成员工工号-费率映射字典 employee_map = {emp.EmployeeNo.strip(): emp.rate for emp in Employees.objects.all() if emp.EmployeeNo} # 遍历打卡数据匹配赋值 for clock in Clock.objects.all(): if not clock.EmployeeNoC: continue emp_no = clock.EmployeeNoC.strip() if emp_no in employee_map: print("yay") clock.hourlyRate = employee_map[emp_no] clock.save(update_fields=['hourlyRate'])
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

