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

5

我在我的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('pass')

        return Response("Just test response")

我不知道这段代码有什么问题。感谢提前帮助!
2个回答

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)

如果您需要更高级的用法,可以在GenericAPIView及其子类中调用serializer_class。例如,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

谢谢!讲解得非常好! - xaos_xv

2

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

此外,你不应该使用views.APIView,而应该使用generics.UpdateAPIView(因为你正在更新字段)

但我不明白你想做什么?你想更新测试用户的密码吗?

在你的post函数中,你应该使用序列化器

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接