Ошибки валидации сериализатора Django во время обновления - PullRequest
0 голосов
/ 07 октября 2019

У меня есть отдельный сериализатор для обновления учетной записи пользователя, и по какой-то причине всякий раз, когда я пытаюсь использовать неверный ввод, он не отправляет ошибки проверки в качестве ответа, он только отправляет обратно исходные значения, которые были установлены. Например. старое имя пользователя - abc123, если я пытаюсь обновить его до abc123 *, я хочу, чтобы он выдавал ошибку, говоря, что это не правильный формат, но вместо этого он просто отправляет обратно abc123 как serializer.data. Кто-нибудь знает, почему это происходит?

сериализатор

class UpdateAccountSerializer(serializers.ModelSerializer):
    username = serializers.CharField(max_length=16)
    full_name = serializers.CharField(max_length=50)

    class Meta:
        model = Account
        fields = ['username', 'full_name']

    def validate_username(self, username):
        if Account.objects.filter(username=username).exists():
            raise serializers.ValidationError(_("This username is taken."))
        if not re.fullmatch(r'^[a-zA-Z0-9_]+$', username):
            raise serializers.ValidationError(
                _("Usernames must be alphanumeric, and can only include _ as special characters."))
        return username

    def validate_full_name(self, full_name):
        if not re.fullmatch(r'^[a-zA-Z ]+$', full_name):
            raise serializers.ValidationError(
                _("Invalid name."))
        return full_name

    def update(self, instance, validated_data):
        instance.username = validated_data.get('username', instance.username)
        instance.full_name = validated_data.get(
            'full_name', instance.full_name)
        instance.save()
        return instance

view

class UpdateAccountView(APIView):

    def patch(self, request, pk, format=None):
        account = Account.objects.filter(id=pk)
        if account.exists():
            account = account[0]
            if request.user == account:
                serializer = UpdateAccountSerializer(
                    account, data=request.data, partial=True)
                if serializer.is_valid():
                    serializer.save()
                    return Response(serializer.data, status=status.HTTP_201_CREATED)
                return Response(serializer._errors, status=status.HTTP_400_BAD_REQUEST)
        return Response(status=status.HTTP_404_NOT_FOUND)

Если вам интересно, почему я использую отдельные сериализаторы для регистрации и обновлений, то это потому, что эти поля должны бытьтолько пользователям разрешено свободно обновлять.

Я думаю, это из-за этих строк (ниже), но я не могу найти исправление.

instance.username = validated_data.get('username', instance.username)
instance.full_name = validated_data.get('full_name', instance.full_name)

1 Ответ

1 голос
/ 07 октября 2019

Ваше возможное решение - raise-exception. измените эти строки

 if serializer.is_valid():
        serializer.save()

на

 if serializer.is_valid(raise_exception=True):
        serializer.save()

И также не нужно перезаписывать метод обновления в сериализаторе.

В строке validated_data.get('username', instance.username), которую мы делаем из объекта словаря validate_data, получить имя пользователя, если его нет, затем установить это значение instance.username. Кстати, еще один запрос исправления, вы должны ответить кодом состояния 200-ok, а не 201-созданным.

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