0

によって呼び出される関数validate()をオーバーライドしようとしていますが、呼び出されません。Djangoシリアライザ:validate関数が呼び出されていない

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()を呼び出しながら、validate()関数内のprint文が実行取得されていません。 何が間違っていますか?

+0

'POST'リクエストでどのデータを渡していますか? – AKS

+0

'{" email ":" xyz "、" password ":"}} – aman

答えて

2

validate機能が呼び出されていないため、print文が表示されないと思います。

エラーは、フィールドのいずれかに存在する場合emailvalidate関数が呼び出されることはありませんが、あなたはis_validに引数としてraise_exception=Trueに合格しなかったので、あなたがこれらのエラーを取得されていません、あなたは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 
+0

私は 'serializer.is_valid(raise_exception = True)'を試しましたが、うまく動作しませんでした。 "フィールドの電子メール、validate関数は " と呼ばれませんが、私はキャプチャしようとしていると右のメッセージを報告しようとしています – aman

+0

何が正確に動作しないのですか?あなたが渡した電子メール、つまり 'xyz'は有効な電子メールではないため、例外が発生すると思います。 – AKS

+0

更新された回答を確認してください。 – AKS

関連する問題