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等第三方对象权限框架,这类框架默认会过滤掉当前用户没有权限的对象,导致即使数据存在也查询不到。
解决方案
- 首先检查
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)
- 如果使用了软删除,确认该条数据是否为软删除状态,如果是需要的正常数据,恢复软删除状态,或者调整业务账号的查询集权限,允许查询软删数据。
- 如果使用了第三方对象权限框架:
- 可以针对
CooperationEmployee模型关闭全局查询过滤配置 - 或者给对应业务账号分配目标
CooperationEmployee对象的修改权限
- 可以针对
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

