Django serializer优化类视图的实现示例


Posted in Python onJuly 16, 2020

一. create优化

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

from django.http import JsonResponse
from django.views import View
import json
from .models import Project
from .serializers import ProjectsSerializer


class ProjectsPage(View):
  '''
  类视图
  '''
  def post(self, request):

    input_data = json.loads(request.body)

    serializer_obj = ProjectsSerializer(data=input_data)

    if not serializer_obj.is_valid():
      return JsonResponse({"code": 1, "res": "error", "msg": serializer_obj.errors})

    obj = Project.objects.create(**input_data)

    ser_obj = ProjectsSerializer(instance=obj)

    return JsonResponse(ser_obj.data, status=201)

可以看到,这里创建了两个序列化器类对象,一个serializer_obj用于反序列化参数校验(用data接受前端参数),一个ser_obj用于序列化输出(用instance接受模型类对象),其实可以去掉ser_obj,然后调用serializer_obj的save()方法,save()方法会自动调用序列化器类对象中定义的create方法

def post(self, request):
    """
    post请求,新增数据
    :param request:
    :return:
    """
    try:

      data = json.loads(request.body, encoding='utf-8')
    except Exception as e:
      result = {
        "msg": "参数有误",
        "code": 0
      }
      return JsonResponse(result, status=400)

    ser_obj = ProjectsSerializer(data=data)
    try:
      ser_obj.is_valid(raise_exception=True)
    except Exception as e:
      result = {"msg": "参数有误"}
      result.update(ser_obj.errors)
      return JsonResponse(result, status=400)

    ser_obj.save()

    resp = {"msg": "创建成功"}
    resp.update(ser_obj.data)

    return JsonResponse(resp, status=201)

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

def create(self, validated_data):
    return [
      self.child.create(attrs) for attrs in validated_data
    ]

重写父类的create方法,并返回模型类对象

def create(self, validated_data):

    obj = Project.objects.create(**validated_data)

    return obj

使用postman验证结果:

Django serializer优化类视图的实现示例

写入数据库的数据:

Django serializer优化类视图的实现示例

二. update优化

def put(self, request, pk):
    try:
      obj = Project.objects.get(id=pk)
    except Exception as e:
      result = {
        "msg": "参数有误",
        "code": 0
      }
      return JsonResponse(result, status=400)

    update_data = json.loads(request.body)

    serializer_obj = ProjectsSerializer(data=update_data)
    if not serializer_obj.is_valid():
      return JsonResponse({"code": 1, "res": "error", "msg": serializer_obj.errors})

    obj.name = serializer_obj.validated_data.get('name') or obj.name
    obj.leader = serializer_obj.validated_data.get('leader') or obj.leader
    obj.desc = serializer_obj.validated_data.get('desc') or obj.programmer
    obj.tester = serializer_obj.validated_data.get('tester') or obj.tester
    obj.save()

    ser_obj = ProjectsSerializer(instance=obj)

    return JsonResponse(ser_obj.data, status=201)

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

def put(self, request, pk):
    try:
      obj = Project.objects.get(id=pk)
    except Exception as e:
      result = {
        "msg": "参数有误",
        "code": 0
      }
      return JsonResponse(result, status=400)

    request_data = request.body

    try:
      python_data = json.loads(request_data)
    except Exception as e:
      result = {
        "msg": "参数有误",
        "code": 0
      }
      return JsonResponse(result, status=400)

    serializer_obj = ProjectsSerializer(instance=obj, data=python_data)
    try:
      serializer_obj.is_valid(raise_exception=True)
    except Exception as e:
      resp = {'msg': '参数有误'}
      resp.update(serializer_obj.errors)
      return JsonResponse(resp, status=400)

    serializer_obj.save()
    resp = {'msg': '修改成功'}
    resp.update(serializer_obj.data)

    return JsonResponse(resp, status=201)

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

def update(self, instance, validated_data):
    raise_errors_on_nested_writes('update', self, validated_data)
    info = model_meta.get_field_info(instance)
    m2m_fields = []
    for attr, value in validated_data.items():
      if attr in info.relations and info.relations[attr].to_many:
        m2m_fields.append((attr, value))
      else:
        setattr(instance, attr, value)
    instance.save()
    for attr, value in m2m_fields:
      field = getattr(instance, attr)
      field.set(value)

    return instance

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

def update(self, instance, validated_data):
    """
    更新数据
    :param instance: 待更新的模型类对象
    :param validated_data: 校验通过之后的数据
    :return: 模型类对象
    """
    instance.name = validated_data.get('name') or instance.name
    instance.leader = validated_data.get('leader') or instance.leader
    instance.tester = validated_data.get('tester') or instance.tester
    instance.desc = validated_data.get('desc') or instance.desc
    instance.save()
    return instance

使用post满验证结果:

Django serializer优化类视图的实现示例

Django serializer优化类视图的实现示例

友情提示:在调用序列化器类对象的save()方法时,可以以关键字的方式传参,它会自动添加到create方法的validated_data中,应用场景:判断当前项目是哪个用户创建的

到此这篇关于Django serializer优化类视图的实现示例的文章就介绍到这了,更多相关Django serializer优化类视图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python自然语言编码转换模块codecs介绍
Apr 08 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
在Python程序中操作文件之flush()方法的使用教程
May 24 Python
Pytorch入门之mnist分类实例
Apr 14 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
python 数据分析实现长宽格式的转换
May 18 Python
Python如何重新加载模块
Jul 29 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 #Python
Python实现GIF图倒放
Jul 16 #Python
浅谈python处理json和redis hash的坑
Jul 16 #Python
Python requests及aiohttp速度对比代码实例
Jul 16 #Python
Python3 搭建Qt5 环境的方法示例
Jul 16 #Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 #Python
Python必须了解的35个关键词
Jul 16 #Python
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
用PHP实现验证码功能
2006/10/09 PHP
PHP脚本的10个技巧(7)
2006/10/09 PHP
php数组去重的函数代码
2013/02/03 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
python递归函数用法详解
2020/10/26 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
软件测试工程师笔试题带答案
2015/03/27 面试题
校园歌手大赛策划书
2014/01/17 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2014年大学生工作总结
2014/11/20 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
浅谈Vue的computed计算属性
2022/03/21 Vue.js
HDFS免重启挂载新磁盘
2022/04/06 Servers
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript