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

Django普通账号访问存在的CooperationEmployee修改页报错,管理员可正常访问

问题原因分析
  • 核心原因是 Django Admin 查找对象时,基于的查询集(QuerySet)中没有包含目标ID的记录,因此抛出DoesNotExist异常,提示对象不存在。管理员账号能正常访问,是因为超级用户默认绕过大部分自定义查询过滤逻辑,能看到全量数据。
  • 最高发的场景是你在CooperationEmployee对应的Admin类中重写了get_queryset方法,过滤逻辑写错:
    很多开发者会错误地直接将CooperationEmployee的主键和当前登录的EmailUserID做匹配,示例错误写法如下:
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        # 错误逻辑:CooperationEmployee的主键和EmailUser的主键没有关联
        return qs.filter(id=request.user.id)
    
    这种情况下,只有当CooperationEmployee的ID恰好和关联的EmailUserID完全一致时才能查到数据,否则就会出现你遇到的问题。
  • 其他可能的原因:
    • 使用了软删除方案,自定义模型管理器默认过滤了已删除的数据,业务账号的查询集不包含软删数据,管理员的查询集则做了特殊处理。
    • 使用了django-guardian等第三方对象权限框架,这类框架默认会过滤掉当前用户没有权限的对象,导致即使数据存在也查询不到。
解决方案
  1. 首先检查CooperationEmployeeAdmin类的get_queryset方法,修改过滤逻辑,通过关联字段email_user匹配当前登录用户:
def get_queryset(self, request):
    qs = super().get_queryset(request)
    if request.user.is_superuser:
        return qs
    # 正确逻辑:通过OneToOne关联字段匹配当前登录的EmailUser
    return qs.filter(email_user=request.user)
  1. 如果使用了软删除,确认该条数据是否为软删除状态,如果是需要的正常数据,恢复软删除状态,或者调整业务账号的查询集权限,允许查询软删数据。
  2. 如果使用了第三方对象权限框架:
    • 可以针对CooperationEmployee模型关闭全局查询过滤配置
    • 或者给对应业务账号分配目标CooperationEmployee对象的修改权限

内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:00:04