DRF自定义序列化程序错误Fomat

时间:2018-05-07 12:46:41

标签: python django django-rest-framework django-serializer

我是Django / Django Rest Framework的新手。 我想要自定义消息,即" staus"以及自定义错误消息。 错误信息可以是。

  1. 未找到电子邮件
  2. 密码错误
  3. 必需的输出格式

    #status_code 200 ok
    {
      "status":"failure",
      "status_message":"Email not found"
    }
    

    View.py

    class UserLogin(APIView):
      permissions_class = [AllowAny]
      serializer_class=UserLoginSerailizer
    
      def post(self, request, *args, **kwargs):
         mydata = request.data
         serializer=UserLoginSerailizer(data=mydata)
         if serializer.is_valid(): 
            new_data=serializer.data
            return Response({"status":"success","message":"success","result":new_data},status=status.HTTP_200_OK)
         return Response({"status":"failure","message":serializer.errors},status=status.HTTP_200_OK)    
    

    Serializer.py

    class UserLoginSerailizer(ModelSerializer):
      email_id=EmailField(required=True)
      password=CharField(required=True,error_messages={'required':'Password field is required.'})
      jwt_token=CharField(allow_blank=True,read_only=True)
    
      class Meta:
        model=User
        fields = [
            'email_id',
            'password',
            'jwt_token',
        ]
        extra_kwargs ={"password":{"write_only":True}}
    
      def validate(self,data):
        user_obj=None
        email_id=data.get("email_id")
        password=data["password"]
        user=User.objects.filter(email=email_id)
    
        if user.exists():
            user_obj =user.first()
        else:
            raise ValidationError({"error_message":"Email not found"})
    
        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError({"error_message":"Wrong password"})
    
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
        payload = jwt_payload_handler(user_obj)
    
        data["jwt_token"]=jwt_encode_handler(payload)
    
        return data
    

    当前输出

     {
      "status": "failure",
      "status_message": {
        "error_message": [
            "Email not found"
        ]
        }
     }
    

    我尝试了另一种方式来自定义ValidationError,但它没有提供200状态代码,而是用于提供400个错误请求,而且我也无法添加自定义消息。我不确定实现这一目标的最佳方法,所以我尝试了这样的方法。请告诉我实现我的要求的最佳方式

2 个答案:

答案 0 :(得分:0)

您可以尝试创建一个实用程序函数,它只需要一些参数并以您需要的格式返回一条消息。

例如..

  def Message(status, message):
    return {"status":status,"status_message":message}

因此,从现在开始,当您需要返回消息时,您只需调用函数

return Response(Message("failure", "Email not found"),status=status.HTTP_200_OK)

显然,您可以向此函数添加更多内容,其他参数将返回数据等。但这取决于您。

答案 1 :(得分:0)

我在serializer.py

中添加了这个custom_validation函数
from rest_framework.exceptions import APIException

class custom_ValidationError(APIException):
 status_code = 200

代码更改

raise ValidationError({"status_message":"Email not found"})

raise custom_ValidationError({"status":"failure","status_message":"Email not found"})

现在我正在使用200 status_code

获得所需的输出
{
 "status":"failure",
 "status_message":"Email not found"
}