Django权限校验方法报Field 'id'类型错误及变更审批后开放编辑问题
Django薪资编辑权限校验报错修复
核心报错原因
- 触发
Field 'id' expected a number but got <Salary: : - Obj>的直接原因:代码中Salary.objects.filter(id=obj).first()行,把类型为Salary模型实例的obj直接作为id筛选条件的值传入查询集,而Django的id字段查询要求匹配整数值,类型不匹配直接抛错。且该行查询返回的salary变量未在后续逻辑中使用,属于完全无效的冗余代码。 - 原代码缺少空值兜底:Django Admin调用该权限方法时,在薪资列表页的权限校验环节会传入
obj=None,此时直接读取obj.hr_state会触发空对象属性访问错误。
修复后可直接运行的代码
def has_change_permission(self, request, obj=None): # 列表页权限校验场景(obj为None),沿用模型级默认权限规则 if obj is None: return super().has_change_permission(request, obj) # 匹配原有业务规则:薪资HR变更状态为已审批、操作用户职位编码为HRM时开放编辑 if ( obj.hr_state == 'request-change-approved' and request.user.user_role.position.code == 'HRM' ): return True return False
优化说明
- 移除了冗余的数据库查询逻辑,减少不必要的SQL开销
- 完整保留原业务判断逻辑,未调整权限规则的业务匹配条件
- 增加空对象兜底判断,兼容Django Admin在不同页面下的方法传参规则
内容的提问来源于stack exchange,提问作者MecaTheclau
相关产品推荐
相关产品推荐

