DRF与React中一对一关联模型的数据新增与更新问题排查
问题解决方案
问题1:PATCH请求返回成功但数据库数据未更新
原因
patch方法中Serializer的context参数传递错误,误将request.user.profile传入,且冗余传递了不必要的user上下文,导致更新逻辑异常。
修复代码(Views.py)
from django.shortcuts import get_object_or_404 class UserProfileDataView(APIView): # 其余代码不变 def patch(self, request, format=None): # 使用get_object_or_404避免无Profile时抛出500错误 item = get_object_or_404(Profile, user = request.user) # 移除错误的user上下文,传递request上下文用于图片字段处理 serializer = ProfileSerializer(item, data = request.data, partial=True, context={'request': request}) serializer.is_valid(raise_exception=True) serializer.save() return Response({'msg':'Profile Updated Successfully'}, status = status.HTTP_200_OK)
问题2:POST创建Profile时提示"user字段必填"
原因
Serializer未重写create方法,无法自动将当前登录用户关联到新创建的Profile;同时user字段未设为只读,导致校验时要求前端传入该字段。
修复步骤
- 修改Serializer.py,重写
create方法并标记user为只读字段:
class ProfileSerializer(serializers.ModelSerializer): class Meta: model= Profile fields = ['user', 'locality','city','address','pin','state','profile_image'] # 将user设为只读,避免前端传递,符合业务逻辑 read_only_fields = ['user'] def create(self, validated_data): # 从context中获取当前登录用户,关联到新Profile user = self.context.get('user') profile = Profile.objects.create(user=user, **validated_data) return profile
- 调整Views.py的post方法,确保context传递正确:
def post(self, request, format=None): serializer = ProfileSerializer(data=request.data, context={'user': request.user, 'request': request}) serializer.is_valid(raise_exception=True) serializer.save() return Response({'msg':'Profile Created Successfully'},status=status.HTTP_201_CREATED)
内容的提问来源于stack exchange,提问作者hima
相关产品推荐
相关产品推荐

