У меня возникли проблемы с получением данных в функции validate() Serializer для моего API. Я использую модель django AbstractUser
Django = "^3.1.3"
djangorestframework = "^3.12.2"
Мои сериализаторы.py:
class ChangePasswordSerializer(serializers.Serializer):
old_password = serializers.CharField(max_length=255, required=True)
new_password = serializers.CharField(max_length=255, required=True, write_only=True)
new_password_confirm = serializers.CharField(max_length=255, required=True, write_only=True)
def validate_old_password(self, value):
if not self.context['user'].check_password(value): # got data
raise serializers.ValidationError("Incorrect Old Password")
def validate_new_password(self, value):
try:
# validate the password and catch the exception
validators.validate_password(password=value) # got data
# the exception raised here is different than serializers.ValidationError
except exceptions.ValidationError as e:
raise serializers.ValidationError(list(e))
def validate_new_password_confirm(self, value):
try:
# validate the password and catch the exception
validators.validate_password(password=value) # got data
# the exception raised here is different than serializers.ValidationError
except exceptions.ValidationError as e:
raise serializers.ValidationError(list(e))
def validate(self, data):
if data['new_password'] != data['new_password_confirm']: # both return None
raise serializers.ValidationError({'message': ["Your password and confirmation password do not match."]})
return data
просмотров.py:
class change_password(APIView):
def post(self, request):
received_json_data=request.data
user = request.user
serializer = ChangePasswordSerializer(data=received_json_data, context = {'user': user})
if serializer.is_valid():
user.set_password(received_json_data['new_password']) # got new_password
return JsonResponse({
'message': 'Password changed.'
}, status=200)
else:
return JsonResponse({'message':serializer.errors}, status=400)
Проблема заключается в проверке (self, data), данные в настоящее время возвращаются как OrderedDict([('old_password', None), ('new_password', None), ('new_password_confirm', None)])
, поэтому пользовательская проверка пропущена, но в других методах проверки validate_old_password
, validate_new_password
и validate_new_password_confirm
я обычно получаю значение, когда распечатываю его.
Я так смущен тем, почему это происходит
Вы всегда должны возвращать значение в методах проверки.
Вместо этого, которое не возвращает значение:
def validate_old_password(self, value):
if not self.context['user'].check_password(value): # got data
raise serializers.ValidationError("Incorrect Old Password")
вы должны написать это:
def validate_old_password(self, value):
if not self.context['user'].check_password(value): # got data
raise serializers.ValidationError("Incorrect Old Password")
return value
Это также является причиной того, что метод validate
не получает данные, поскольку сначала запускаются методы проверки для отдельных полей.
Глава о проверке на уровне поля упоминается здесь.
о, я вижу, это странно, что первые 3 проверки не уведомляют об ошибке, которую нужно вернуть, как в validate(), если отсутствуют возвращаемые данные. Также документы не упоминают много ;-; django-rest-framework.org/api-guide/validators/#Optional-Fields. Но спасибо за ответ, это сработало ( я приму, когда это позволит мне)