Django Rest Framework - Serializer验证不起作用

时间:2018-05-05 12:40:12

标签: 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

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

class DataUpdateAPI(views.APIView):
    serializer_class = DataUpdateSerializer

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

        return Response("Just test response")

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

2 个答案:

答案 0 :(得分:1)

首先,你不应该使用你应该使用的request.POST insted,request.data(它更有用)

另外你不应该使用views.APIView,你应该使用generics.UpdateAPIView(因为你是更新字段)

但我不想做你想做的事吗?您想更新测试用户密码吗?

您应该在帖子功能中使用序列化器

def post(self, request)
    data = request.data
    serializer = DataUpdateSerializer(data=data)
    if serializer.is_valid():
       return Response("all right")
    return Response(data=serializer.errors)

答案 1 :(得分:1)

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)

如果您想要更高级别的使用,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