Django Rest Framework: обновление пользователя - PullRequest
0 голосов
/ 26 октября 2018

Я знаю, что это обсуждалось, и это просто, но я не могу найти, что с ним не так.Я поднял свои старые проекты (которые работают!) И соответствовал тому, что я сделал.Это никогда не доходит до обновления в сериализаторе, и я не знаю, почему.Я не знаю, что еще мне не хватает.

Ошибка :

{"last_name": ["Это поле не может быть пустым."],"pass… null."], "email": ["Это поле не может быть пустым."]}, статус: 400

frontend 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   

views.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)

1 Ответ

0 голосов
/ 26 октября 2018

Единственная реализация, которую вам может потребоваться предоставить для APIView, - это метод get_object.

Из источника для mixins.UpdateMixins, update (для запросов HTTP PUT) и partial_update реализованы так, как есть.

Переопределение для mixins.UpdateMixins.update, которое вы предоставляете, позволяет частично обновлять запросы HTTP PUT и пропускает передачу экземпляра модели в сериализатор для обновления. т

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

Однако я предлагаю не выполнять переопределение для mixins.UpdateMixins.update текущим способом.
Используйте стандартную обработку HTTP-запросов, реализованную в mixins.UpdateMixins, и предоставьте свою реализацию только для .get_object().

Вы делаете это уже с UserRetrieveUpdateAPIView.get_object().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...