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调用java的Webservice示例
Mar 10 Python
Python编程中运用闭包时所需要注意的一些地方
May 02 Python
python fabric实现远程部署
Jan 05 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
May 08 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
详解Python用户登录接口的方法
Apr 17 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
浅析python中特殊文件和特殊函数
Feb 24 Python
关于Python中进度条的六个实用技巧分享
Apr 05 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
是否存在第一台收音机的说法
2021/03/01 无线电
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
基于PHP文件操作的详解
2013/06/05 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
python中enumerate函数用法实例分析
2015/05/20 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python用户自定义异常的实现
2020/12/25 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
个人应聘自我评价分享
2013/11/18 职场文书
建筑工地标语
2014/06/18 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
追讨欠款律师函
2015/05/27 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python
Oracle中日期的使用方法实例
2022/07/07 Oracle