美文网首页软件测试
8、序列化器serializer的使用

8、序列化器serializer的使用

作者: 小啊小狼 | 来源:发表于2020-09-18 15:37 被阅读0次

    根据需要定义好序列化器类以后,我们可以在视图中调用序列化器,实现输入数据的反序列化及输出数据的序列化
    一般会有如下场景:

    一、只涉及到输入数据的校验

    a.创建序列化器类
    b.创建序列化对象 序列化器类(data=字典)
    c.调用序列化对象的is_valid()方法进行校验,raise_exception=True校验失败返回错误信息:序列化对象.is_valid(raise_exception=True)
    d.校验失败,则获取错误信息:序列化对象.errors
    e.校验成功,则获取校验成功之后的值:序列化对象.validated_data

    ret = {
            "msg": "",
            "code": 0
    }
    class ProjectsView(View):
        def post(self, request):
            # a.获取新的项目信息并转化为python中数据类型(字典或者嵌套字典的列表)
            request_data = request.body
            try:
                python_data = json.loads(request_data)
            except Exception as e:
                result = {
                    "msg": "参数有误",
                    "code": 0
                }
                return JsonResponse(result, status=400)
    
            # b、创建序列化器对象
            serializer_obj = ProjectsSerializer(data=python_data)
            try:
                # c.序列化器对象调用is_valid()方法,开始进行校验,如果不调用此方法,那么不会进行校验,如果校验成功,返回True,否则返回False
                serializer_obj.is_valid(raise_exception=True)
            except Exception as e:
                ret['msg'] = '参数有误'
                #d.必须调用is_valid()方法之后,才能使用.errors属性去获取报错信息,相当于一个字典
                ret.update(serializer_obj.errors)
                return JsonResponse(ret, status=400)
    
            #e.必须调用is_valid()方法之后校验通过后,才能使用.validated_data属性去获取校验通过信息
            ret.update(serializer_obj.validated_data)
            
            return JsonResponse(ret, status=201)
    

    二、如果仅仅获取数据库中的数据

    a.创建序列化器类
    b.创建序列化对象

    • 序列化器类(instance=模型对象)
    • 序列化器类(instance=查询集对象, many=True)
    • 序列化器类(instance=普通对象)

    c.序列化输出:序列化对象.data

    class ProjectsView(View):
    
        def get(self, request):
            qs = Projects.objects.all()
            qs1=Projects.objects.get(id=1)
            serializer_obj = ProjectsSerializer(instance=qs, many=True)
            serializer_obj1 = ProjectsSerializer(instance=qs)
            return JsonResponse(serializer_obj.data, status=200, safe=False)
    

    三、既需要做数据校验也需要修改数据库中的数据

    a.创建序列化器类
    b.创建序列化对象

    • 序列化器类(instance=模型对象, data=字典)
    • 序列化器类(data=字典)

    c.开始进行校验:序列化对象.is_valid()
    d.获取错误信息:序列化对象.errors
    e.获取校验成功之后对数据进行修改

    • 没有给instance传参:序列化对象.save() ->调用序列化器类的.create()方法
    • 有给instance传参:序列化对象.save() -> 调用序列化器类的.update()方法

    f.序列化输出:序列化对象.data

    def put(self, request, pk):
        ret = {
            "msg": "",
            "code": 0
        }
        obj = self.get_object(pk)
        request_data = request.body
        try:
            python_data = json.loads(request_data)
        except Exception as e:
            result = {
                "msg": "参数有误",
                "code": 0
            }
            return JsonResponse(result, status=400)
    
        # 如果在定义序列化器对象时,同时指定instance和data参数,调用序列化器对象.save()方法,会自动调用序列化器类中的update方法
        serializer_obj = ProjectsModelSerializer(instance=obj, data=python_data)
        serializer_obj1 = ProjectsModelSerializer( data=python_data)
        try:
            serializer_obj1.is_valid(raise_exception=True)
        except Exception as e:
            ret['msg'] = '参数有误'
            ret.update(serializer_obj1.errors)
            return JsonResponse(ret, status=400)
        #会自动调用序列化器类中的update方法
        serializer_obj.save()
        
        #调用序列化器对象.save()方法
        serializer_obj1.save()
    
        return JsonResponse(serializer_obj1.data, status=201)
    

    相关文章

      网友评论

        本文标题:8、序列化器serializer的使用

        本文链接:https://www.haomeiwen.com/subject/oqdjyktx.html