美文网首页软件测试
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