POST上的is_valid()上未调用序列化器`validate()`

时间:2019-06-04 14:31:55

标签: django-rest-framework

我想创建一个非基于类的表单,以方便用户跨所有前端应用程序进行统一登录。目前看起来像这样

我的序列化程序类:

class EmployeeLoginSerializer(serializers.Serializer):
    username = serializers.CharField(min_length=6)
    password = serializers.CharField(min_length=6)

    def validate_credentials(self, attrs):
        print('validating')
        try:
            emp: Employee = Employee.objects.get(username=attrs['username'])
            if crypto.verify_password(attrs['password'], emp.password_hash):
                return attrs
        except Exception:
            raise serializers.ValidationError("Incorrect username or password")
        raise serializers.ValidationError('Incorrect username or password')

我的视图类:

class TestView(APIView):
serializer_class = EmployeeLoginSerializer

def get(self, request, *args, **kwargs):
    return Response({'Message': 'Get works'})

def post(self, request, *args, **kwargs):
    print(request.POST)
    serializer = self.serializer_class(data=request.POST)
    if serializer.is_valid():
        return Response({'Message': 'Credentials were correct'})

我的问题是serializer.is_valid()似乎没有自动调用验证。我知道我可以手动调用serializer.validate(),但是StackOverflow上的所有文档和问题似乎都显示validate()is_valid()自动调用了,所以我觉得那不是最好的实践。有什么我想念的吗?

1 个答案:

答案 0 :(得分:2)

is_valid() 方法将调用序列化程序的 validate() 方法和validate_FIELD_NAME()方法。

在您的代码中, validate_credentials() 似乎是 常规类方法 ,自 {{ 1}} 不是序列化程序上的 credentials