zoukankan      html  css  js  c++  java
  • 序列化组件之数据校验与保存

    一  序列化组件之请求数据校验和保存功能

    组件

    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = '__all__'
    
        name = serializers.CharField(min_length=2, error_messages={'required': '该字段必填'})
        authors = serializers.CharField(required=False)

    views

    class Books(APIView):
        def get(self, request, *args, **kwargs):
            ret = models.Book.objects.all()
            # 生成一个序列化的对象,传参数
            # 序列化多条,记住many=True
            book_ser = BookSerializer(ret, many=True, context={'request': request})
            print(book_ser.data)
            return JsonResponse(book_ser.data, safe=False)
    
        def post(self, request, *args, **kwargs):
            # 前端传递过来的数据从data中取
            # 用序列化类的数据校验
            # data参数,是要校验的数据
            response = {'status': 100, 'msg': '成功'}
            ser = BookSerializer(data=request.data)
            if ser.is_valid():
                # 如果数据校验通过,is_valid是True
                # 保存到数据库,ser是谁的对象?继承了ModelSerializer的类的对象
                ser.save()
            else:
                response['status'] = 101
                response['msg'] = ser.errors
            return JsonResponse(response, safe=False)

     局部钩子与全局钩子

    # 局部钩子:
        def validate_name(self, value):
            # print(value)
            if value.startswith('sb'):
                # 不能以sb开头
                raise ValidationError('不能以sb开头')
            else:
                return value
    
        # 全局钩子找到了
        def validate(self, value):
            # value是所有校验通过数据的字典
            print(value)
            name = value.get('name')
            price = value.get('price')
            if name and price:
                if str(name) == str(price):
                    return value
                else:
                    raise ValidationError('名字跟价格不相等')
            return value

    全局钩子与局部钩子校验

    class BookDetail(APIView):
        def get(self,request,pk):
            response={'status':100,'msg':'成功'}
            ret = models.Book.objects.filter(nid=pk).first()
            if ret:
                book_ser = BooksSerializer(ret,many=False)
                response['data']=book_ser.data
            else:
                response['status']=101
                response['msg']='您查询的对象不存在'
    
            return JsonResponse(response,safe=False)
    
        def put(self,request,pk):
            response={'status':100,'msg':'成功'}
            ret = models.Book.objects.all().filter(pk=pk).first()
            if ret:
                ret_ser = BooksSerializer(data=request.data,instance=ret)
                if ret_ser.is_valid():
                    ret_ser.save()
                else:
                    response['status']=101
                    response['msg']=ret_ser.errors
            else:
                response['status']=102
                response['msg']='您访问的对象不存在'
            return JsonResponse(response,safe=False)

    前台错误数据

     钩子校验

  • 相关阅读:
    16.14
    16.13
    JAVA JLabel自定义子类无法显示
    16.12
    16.11
    css实现垂直居中
    HTML5学习笔记
    HTML、Css中插入图片的一些问题
    MySQL的if函数
    java实现将汉字转为首字母、拼音
  • 原文地址:https://www.cnblogs.com/zhaijihai/p/10109741.html
Copyright © 2011-2022 走看看