Django Rest Framework - 序列化器验证不起作用

xao*_*_xv 5 django django-rest-framework

我的序列化器很简单serializers.py,我想使用其中一个字段进行验证,validate(self, data)但它不起作用。

这是我的代码:

class DataUpdateSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField(write_only=True)

    def validate(self, data):
        if data['username'] != 'test':
            raise serializers.ValidationError('Wrong username')
        return data
Run Code Online (Sandbox Code Playgroud)

我不知道这是否有帮助,但这是我的views.py

class DataUpdateAPI(views.APIView):
    serializer_class = DataUpdateSerializer

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('pass')

        return Response("Just test response")
Run Code Online (Sandbox Code Playgroud)

我不知道这段代码有什么问题。先谢谢您的帮助!

hoe*_*ing 7

APIView是一个不使用属性的低级视图类serializer_class。如果你想使用它,你必须自己实例化并调用序列化器:

import rest_framework

class DataUpdateAPI(views.APIView):

    def post(self, request):
        serializer = DataUpdateSerializer(data=request.data)
        if serializer.is_valid():
            # do smth with serializer.data, it's valid now
            return Response("Just test response")
        return Response(serializer.errors, status=rest_framework.status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

如果您想要更高级的使用,则serializer_class在 和 子类中实现的调用GenericAPIView。例如,CreateAPIView已经实现了post反序列化和验证的方法,因此您不必重新发明轮子:

class DataUpdateSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField(write_only=True)

    def validate(self, data):
        if data['username'] != 'test':
            raise serializers.ValidationError('Wrong username')
        return data

    def create(self, validated_data):
        print('my data is already validated here', validated_data)


class DataUpdateAPI(rest_framework.generics.CreateAPIView):
    serializer_class = DataUpdateSerializer
Run Code Online (Sandbox Code Playgroud)