zoukankan      html  css  js  c++  java
  • DRF框架serializer之视图优化

    一、create优化

    在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:

    from django.http import JsonResponse
    from django.views import View
    from django.db import connection
    import json
    from .models import Projects
    from .serializers import ProjectSerializer
    
    
    class ProjectsPage(View):
        '''
        类视图
        '''
        def post(self, request):
    
            input_data = json.loads(request.body)
    
            serializer_check_obj = ProjectSerializer(data=input_data)
    
            if not serializer_check_obj.is_valid():
                return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})
    
            obj = Projects.objects.create(**serializer_check_obj.validated_data)
    
            serializer_obj = ProjectSerializer(instance=obj)
         return JsonResponse(serializer_obj.data, status=201)

    如上我们可以看到,实际上我们创建了两个序列化器类对象,一个serializer_check_obj用于反序列化参数校验(给data传参),一个serializer_obj用于序列化输出(给instance传参),能不能只创建一个序列化器对象就能实现两个对象的功能呢?答案是可以的,我们可以去掉serializer_obj,然后调用serializer_check_obj的save()方法,save()方法会自动调用模型类对象中定义的create方法

        def post(self, request):
    
            input_data = json.loads(request.body)
    
            serializer_check_obj = ProjectSerializer(data=input_data)
    
            if not serializer_check_obj.is_valid():
                return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})
    
            serializer_check_obj.save()
    
            return JsonResponse(serializer_check_obj.validated_data, status=201)

    模型类中的create方法需要提前定义,该方法是父类的create方法,我们可以进行重写,父类方法源码如下:

     在序列化器类中重写父类的create方法,并返回模型类对象

        def create(self, validated_data):
            obj = Projects.objects.create(**validated_data)
            return obj

    验证结果:

    在调用序列化器类对象的save()方法时,也可以传参,传参以关键字的方式传入,它会自动添加到create方法的validated_data中,我们可以根据这个参数去进行一些关联,如判断当前项目已登录,或者当前这个项目判断是哪个用户创建的

    二、update优化

    原代码如下:

        def put(self, request, pk=None):
            if pk:
                update_data = json.loads(request.body)
                obj = Projects.objects.get(id=pk)
    
                serializer_check_obj = ProjectSerializer(data=update_data)
                if not serializer_check_obj.is_valid():
                    return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})
    
                obj.name = serializer_check_obj.validated_data.get('name') or obj.name
                obj.leader = serializer_check_obj.validated_data.get('leader') or obj.leader
                obj.programmer = serializer_check_obj.validated_data.get('programmer') or obj.programmer
                obj.tester = serializer_check_obj.validated_data.get('tester') or obj.tester
                obj.save()
    
                serializer_obj = ProjectSerializer(instance=obj)
    
                return JsonResponse(serializer_obj.data, status=201)

    上面创建了两个序列化器类的对象,我们也可以进行合并,合并方式跟create有点差别,这里是给模型类对象同时传入data和instance,然后调用save()方法,它会自动去调用序列化器类中的update方法

    优化后的put方法:

        def put(self, request, pk=None):
            if pk:
                update_data = json.loads(request.body)
                obj = Projects.objects.get(id=pk)
    
                serializer_obj = ProjectSerializer(data=update_data, instance=obj)
                if not serializer_obj.is_valid():
                    return JsonResponse({"code": 1, "res": "error", "msg": serializer_obj.errors})
    
                serializer_obj.save()
    
                return JsonResponse(serializer_obj.data, status=201)

    模型类中的update方法需要提前定义,该方法是父类的update方法,我们可以进行重写,父类方法源码如下:

      在序列化器类中重写父类的update方法,并返回模型类对象

        def update(self, instance, validated_data):
            # instance为待更新的模型类对象
            # validated_data参数为校验通过之后的数据
            # 必须将更新成功的模型类对象返回
            instance.name = validated_data.get('name') or instance.name
            instance.leader = validated_data.get('leader') or instance.leader
            instance.programmer = validated_data.get('programmer') or instance.programmer
            instance.tester = validated_data.get('tester') or instance.tester
            instance.save()
            return instance

    验证结果:

  • 相关阅读:
    Python3之命令行参数处理
    基于 Laradock 环境 Project 的总结
    Typora功能新发现-自动复制图片到指定目录下
    ubuntu 18.04 设置静态ip方法
    vscode 同时编辑多处,多个光标 快捷键
    nginx和ftp搭建图片服务器
    Centos 6.5出现yum安装慢的情况
    Linux中的CentOS 6克隆之后修改
    springMVC-文件上传CommonsMultipartFile
    Spring和mybatis整合 org.mybatis.spring.mapper.MapperScannerConfigurer
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/13285245.html
Copyright © 2011-2022 走看看