Django REST Framework用户资料修改接口问题:资料无法保存
问题分析与代码修正
你的代码存在几个核心问题导致资料无法保存:
- 错误使用POST方法处理更新逻辑,REST规范中更新资源应使用PUT/PATCH
- 序列化器未实现
update方法,反而错误重写了create方法(create用于新建资源,而非更新) - 视图中未调用序列化器的
save()方法,验证通过后没有执行保存动作 - 获取当前用户的方式错误,Token认证通过后可直接从
request.user获取,无需手动查询Token - 权限设置不合理,应限制仅登录用户可修改自身资料
修正后的serializers.py
from rest_framework import serializers from .models import CustomUser class ProfileSerializer(serializers.ModelSerializer): class Meta: model = CustomUser fields = ("first_name", ) def update(self, instance, validated_data): # 从validated_data中获取first_name,若未传则保留原有值 instance.first_name = validated_data.get('first_name', instance.first_name) instance.save() return instance
修正后的views.py
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status, permissions, authentication from .serializers import ProfileSerializer class ProfileAPIView(APIView): serializer_class = ProfileSerializer permission_classes = [permissions.IsAuthenticated] # 仅登录用户可访问 authentication_classes = [authentication.TokenAuthentication] def get_object(self): # 返回当前登录的用户实例 return self.request.user def put(self, request): user = self.get_object() # partial=True允许仅更新部分字段 serializer = ProfileSerializer(user, data=request.data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() # 触发序列化器的update方法完成保存 return Response( {"msg":"Profile Updated Successfully", "data": serializer.data}, status=status.HTTP_200_OK ) # 兼容PATCH方法(与PUT逻辑一致,支持部分更新) def patch(self, request): return self.put(request)
关键说明
- 使用
PUT/PATCH方法处理更新,partial=True允许仅提交需要修改的字段 - 序列化器实现
update方法,直接操作传入的用户实例完成更新 - 通过
request.user直接获取当前登录用户,避免冗余的Token查询 - 权限改为
IsAuthenticated,确保只有登录用户能修改自身资料 - 必须调用
serializer.save()才能触发数据保存动作
内容的提问来源于stack exchange,提问作者Harsh Kathiriya
相关产品推荐
相关产品推荐

