Когда "raise_exception=True" будет проходить через функцию is_valid()?

Мой Serializer.py

В этом MovieSerializer я проверю, совпадают ли "name" и "description" или нет, если совпадают, то выдам ошибку.


class MovieSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=80)
    description = serializers.CharField(max_length=300)

    def create(self, validated_data):
        return Movie.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.save()
        return instance
    
    
    # object level validation
    def validate(self, data):
        if data['name'] == data['description']:
            raise serializers.ValidationError("Name and Description can not be Same.")
        else:
            return data

Мой views.py

в serializer.is_valid() не передается raise_exception=True, когда 'name' и 'description' одинаковы, возвращается сообщение об ошибке. вывод :

My error message


class MovieListAV(APIView):

    def post(self, request):
        serializer = MovieSerializer(data=request.data)

        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)

Мой другой сериализатор

проверить "password" и "confirm_password" одинаковые или нет, если разные, то выдать ошибку.

class UserPasswordChangeSerializer(serializers.Serializer):
    password = serializers.CharField(write_only=True, style={'input_type':'password'})
    confirm_password = serializers.CharField(write_only=True, style={'input_type':'password'})

    class Meta:
        fields = ['password', 'confirm_password']
    
    def validate(self, attrs):
        password = attrs.get('password')
        password2 = attrs.get('confirm_password')

        if password != password2:
            raise serializers.ValidationError({'password':'Password and Confirm Password Should be Same!'})
        user = self.context.get('user')
        user.set_password(password)
        user.save()
        return attrs

Мое другое мнение

serializer.is_valid() не передает raise_exception=True, когда "password" и "confirm_password" различаются, он не может вернуть никакого оформленного сообщения об ошибке. inside postman no response

но когда я использую "raise_exception=True" в качестве параметра функции is_valid(), например serializer.is_valid(raise_exception=True), то получаю форматированное сообщение об ошибке.

Мой вопрос в том, почему на этот раз мне нужно передать "raise_exception=True"? Но в представлении класса "MovieListAV" нет необходимости передавать "raise_exception=True" в is_view()


class UserPasswordChange(APIView):
    authentication_classes = [JWTAuthentication, ]
    permission_classes = [IsAuthenticated, ]

    def post(self, request, *agrs, **kwargs):
        user = User.objects.get(email=request.user)
        serializer = UserPasswordChangeSerializer(data=request.data, context={'user':user})

        if serializer.is_valid():
            return Response({'success':'Password Change successfull.'}, status=status.HTTP_202_ACCEPTED)
    
        return Response(serializer.errors, status=status.HTTP_304_NOT_MODIFIED)

Вернуться на верх