【问题标题】:Django Rest Framework - Serializer validation doesn't workDjango Rest Framework - 序列化程序验证不起作用
【发布时间】:2023-03-18 12:08:01
【问题描述】:

我的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")

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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
    

    【讨论】:

    • 谢谢!很好的解释!
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 2018-07-06
      • 1970-01-01
      • 2015-02-27
      • 2023-03-24
      • 1970-01-01
      • 2020-08-04
      • 2020-05-23
      • 2018-02-10
      相关资源
      最近更新 更多