首页 > 解决方案 > Django Rest 框架:用户更新

问题描述

我知道这已经讨论过了,而且很基本,但我找不到它有什么问题。我已经提取了我的旧项目(有效!)并与我所做的相对应。它永远不会在序列化程序中更新,我不知道为什么。我不知道我还缺少什么。

错误

{"last_name":["此字段不得为空。"],"pass... null."],"email":["此字段不得为空"]},状态:400

前端patch('api/getprofile')

django/DRF序列化器:

class UserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    email = serializers.EmailField()
    password = serializers.CharField(style={'input_type': 'password'})

    class Meta:
        model = User
        fields = '__all__'

    def create(self, validated_data):
        user = User.objects.create(
            username=validated_data.get('username'),
            email=validated_data.get('email'),
            password=validated_data.get('password')
        )
        user.set_password(validated_data.get('password'))
        user.save()
        return user

    def update(self, instance, validated_data):
        #print instance <-- if never gets here... is update not update
        for key, value in validated_data.items():
            if value:
                print value
                setattr(instance, key, value)
        instance.save()
        return instance   

视图.py

class UserRetrieveUpdateAPIView(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    permission_classes = (IsAuthenticated, )
    queryset = User.objects.all()

    def get_object(self):
        return self.request.user

    def update(self, request, *args, **kwargs):
        serializer = UserSerializer(data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        instance = serializer.instance
        return Response(UserSerializer(instance=instance).data, status=status.HTTP_200_OK)

标签: pythondjangodjango-rest-framework

解决方案


您可能需要为您提供的唯一实现APIViewget_object方法。

从源代码mixins.UpdateMixinsupdate(用于 HTTP PUT 请求)并partial_update按照您的方式实现。

您提供的覆盖mixins.UpdateMixins.update允许对请求进行部分更新,HTTP PUT并且错过将模型实例传递给序列化程序以进行更新。IE

serializer = UserSerializer(self.get_object(), data=request.data, partial=True)

但是,我建议不要mixins.UpdateMixins.update以当前方式执行覆盖。
使用实现的 HTTP 请求的标准处理,mixins.UpdateMixins并且只为.get_object().

你已经用UserRetrieveUpdateAPIView.get_object().


推荐阅读