简体   繁体   English

Django 序列化程序:未调用验证函数

[英]Django serializers: validate function not called

I am trying override validate() function to be called by serializers.is_valid() , but its not getting called.我正在尝试覆盖由serializers.is_valid()调用的validate()函数,但它没有被调用。

serializer.py序列化程序.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视图.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)

while i call is_valid() , the print statement inside validate() function is not getting executed.当我调用is_valid()validate()函数中的打印语句没有被执行。 what am i doing wrong?我做错了什么?

I think you are not getting any print statements because validate function is not being called.我认为您没有收到任何print语句,因为没有调用validate函数。

If there is an error in one of the fields say email , validate function won't be called but since you didn't pass raise_exception=True as argument in is_valid you are not getting those errors and you assume that is_valid is not running.如果其中一个字段中有错误,例如email ,则不会调用validate函数,但由于您没有将raise_exception=True作为is_valid参数is_valid您不会收到这些错误,并且您假设is_valid没有运行。

You could write the post method as following:您可以将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 : If you want to raise specific message after validating different fields, you could create a method validate_<fieldname> in serializer:更新:如果您想在验证不同字段后引发特定消息,您可以在序列化程序中创建一个方法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

I had the same error.我有同样的错误。 Try to go with尝试去

def run_validation(self, data):
...

instead of而不是

def validation(self, data):
...

this should work!这应该工作!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM