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 相关文章推荐
Linux环境下MySQL-python安装过程分享
Feb 02 Python
Python中下划线的使用方法
Mar 27 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
Jun 04 Python
python3读取autocad图形文件.py实例
Jun 05 Python
Pytest如何使用skip跳过执行测试
Aug 13 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 ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
php下使用iconv需要注意的问题
2010/11/20 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
Add a Table to a Word Document
2007/06/15 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
shiro授权的实现原理
2017/09/21 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
对python的文件内注释 help注释方法
2018/05/23 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
给客户的道歉信
2014/01/13 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
社区健康教育实施方案
2014/03/18 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书