You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 04:36:04