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函数中的函数(闭包)用法实例
Mar 15 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python实现简单的用户交互方法详解
Sep 25 Python
Django之模板层的实现代码
Sep 09 Python
python打包成so文件过程解析
Sep 28 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
python解析照片拍摄时间进行图片整理
Jul 23 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
ThinkPHP之import方法实例详解
2014/06/20 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
JS实现多物体运动的方法详解
2018/01/23 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
企划经理的岗位职责
2013/11/17 职场文书
大学四年学习的自我评价分享
2013/12/09 职场文书
领导失职检讨书
2014/02/24 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
财务情况说明书范文
2014/05/06 职场文书
任命书模板
2014/06/04 职场文书
新文化运动的口号
2014/06/21 职场文书
银行求职自荐信
2014/06/30 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
自主招生自荐信范文
2015/03/04 职场文书