Когда "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' одинаковы, возвращается сообщение об ошибке. вывод :
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" различаются, он не может вернуть никакого оформленного сообщения об ошибке.
но когда я использую "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)