Сериализатор Django-Rest-Framework проверяет возврат данных Нет

У меня возникли проблемы с получением данных в функции 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 я обычно получаю значение, когда распечатываю его.

Я так смущен тем, почему это происходит

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 618
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы всегда должны возвращать значение в методах проверки.

Вместо этого, которое не возвращает значение:

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-Fie‌​lds. Но спасибо за ответ, это сработало ( я приму, когда это позволит мне)

Linh Nguyen 23.12.2020 09:08

Глава о проверке на уровне поля упоминается здесь.

Nepo Znat 23.12.2020 09:13

Другие вопросы по теме