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

Django Rest-Framework JWT认证下更新数据遇user_not_found问题求助

问题分析与解决方案

出现user_not_found错误的核心原因有两点:

  1. 权限验证的用户匹配问题:IsAuthenticated权限依赖JWT令牌解析出的request.user,如果令牌对应的用户在数据库中不存在,或是你的Register模型与Django认证系统的用户模型未正确关联,就会触发该错误。
  2. 业务逻辑冗余且不安全:当前通过请求体中的phone_number查询记录,既违背了认证权限的设计逻辑(已认证用户应只能修改自身记录),也可能因手机号与当前认证用户不匹配导致冲突。

修复步骤

1. 确认用户模型关联(关键前提)

如果Register是自定义用户模型(继承AbstractUser),必须在项目settings.py中配置:

AUTH_USER_MODEL = '你的应用名.Register'

如果Register是与Django默认User模型关联的扩展模型(比如通过OneToOneField),要确保注册时已为新创建的User绑定对应的Register实例。

2. 重构set_mpin视图

直接使用认证后的request.user获取对应记录,既解决权限验证问题,也保证业务逻辑的安全性:

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def set_mpin(request):
    # 从认证用户直接获取对应的Register实例
    try:
        # 若Register是自定义用户模型,直接用request.user
        registered_user = request.user
        # 若为关联模型,改为:registered_user = request.user.register
    except Register.DoesNotExist:
        return Response({'status': 404, 'message': '用户记录未找到'})

    serializer = SetMpinSerializer(registered_user, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response({'status':200, 'message':'MPIN设置成功'})
    else:
        return Response({'status':400, 'message':'参数无效', 'errors': serializer.errors})

3. 确保请求正确携带JWT令牌

发起PUT请求时,必须在请求头中添加认证信息:

Authorization: Bearer <你的access_token>

额外优化建议

  • 在SetMpinSerializer中移除phone_number字段(无需再接收,直接从认证用户获取),避免冗余参数。
  • 注册时确保RegisterSerializer正确创建/关联用户模型,保证JWT令牌生成的用户与Register实例一一对应。

内容的提问来源于stack exchange,提问作者Parthasarathi Behera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:52:26