Сериализаторы Django: функция проверки не вызывается



Я пытаюсь переопределить validate() функцию, вызываемую serializers.is_valid(), но ее не вызывают.



Serializer.py



class LoginSerializer(serializers.Serializer):
email = serializers.EmailField(max_length=255,required=True)
password = serializers.CharField(max_length=128,required=True)


def validate(self,data):
'''
Check for invalid email.
& blank email and password.
'''

print 'hey i am in login'

if data['email'] is '':
raise serializers.ValidationError("Email cannot be empty.")
if data['password'] is '':
raise serializers.ValidationError("Password cannot be empty.")
try:
validate_email(data['email'])
except ValidationError:
raise serializers.ValidationError("The email is not a valid email address.")
return data


Views.py



class LoginAPI(APIView):
permission_classes = (permissions.AllowAny,)
serializer = LoginSerializer

def post(self, request):
data = self.serializer(data=request.data)
if data.is_valid():
#do something
else:
return Response(data.errors,status=status.HTTP_400_BAD_REQUEST)


Пока я вызываю is_valid(), оператор print внутри функции validate() не выполняется.
Что я делаю не так?

648   1  

1 ответ:

Я думаю, что вы не получаете никаких операторов print, потому что функция validate не вызывается.

Если есть ошибка в одном из полей, скажем email, validate функция не будет вызвана, но поскольку вы не передали raise_exception=True в качестве аргумента в is_valid , вы не получаете эти ошибки и предполагаете, что is_valid не выполняется.

Можно записать метод post следующим образом:

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

   # following will automatically raise an exception if the serialize data is not valid
   serializer.is_valid(raise_exception=True)

   # do something if the serializer is valid

UPDATE: Если вы хотите вызвать определенное сообщение после проверки различных полей, вы можете создать метод validate_<fieldname> в сериализаторе:

def validate_email(self, value):

    if value == '':
        raise serializers.ValidationError("Email cannot be empty.")

    try:
        validate_email(value)
    except ValidationError:
        raise serializers.ValidationError("The email is not a valid email address.")

    return value

Comments

    Ничего не найдено.