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中用altzone()方法处理时区的教程
May 22 Python
Python中列表元素转为数字的方法分析
Jun 14 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python3 操作符重载方法示例
Nov 23 Python
python基础教程项目二之画幅好画
Apr 02 Python
python 以16进制打印输出的方法
Jul 09 Python
python3 flask实现文件上传功能
Mar 20 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
在python里创建一个任务(Task)实例
Apr 25 Python
使用numpy nonzero 找出非0元素
May 14 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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 魔术函数使用说明
2010/05/14 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
黄河的主人教学反思
2014/02/07 职场文书
大学生社会实践方案
2014/05/11 职场文书
城市创卫标语
2014/06/17 职场文书
学校安全责任书范本
2014/07/23 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Flink 侧流输出源码示例解析
2022/09/23 Servers