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使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
django中模板的html自动转意方法
May 27 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
pandas数据集的端到端处理
Feb 18 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
python3下pygame如何实现显示中文
Jan 11 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 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下实现农历日历的代码
2007/03/07 PHP
理解php Hash函数,增强密码安全
2011/02/25 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
Webpack3+React16代码分割的实现
2021/03/03 Javascript
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python读取oracle函数返回值
2016/07/18 Python
Python实现感知机(PLA)算法
2017/12/20 Python
numpy返回array中元素的index方法
2018/06/27 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
python redis存入字典序列化存储教程
2020/07/16 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
促销活动方案模板
2014/02/24 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
功夫熊猫观后感
2015/06/10 职场文书
导游词之无锡唐城
2019/12/12 职场文书
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫
Hive导入csv文件示例
2022/06/25 数据库