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内置函数之filter map reduce介绍
Nov 30 Python
python目录与文件名操作例子
Aug 28 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
关于Python turtle库使用时坐标的确定方法
Mar 19 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 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
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
如何提高数据访问速度
2016/12/26 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
Python性能优化技巧
2015/03/09 Python
python模块之StringIO使用示例
2015/04/08 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python执行时间的计算方法小结
2017/03/17 Python
Linux下python制作名片示例
2018/07/20 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
2014年工会工作总结
2014/11/12 职场文书
2015年工程部工作总结
2015/04/30 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers