Django rest_framework Serializer中的create、Views中的create/perform_create的区别

Django rest_framework Serializer中的create、Views中的create/perform_create的区别


对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功能组件以及这些组件的常规用法与重写复用。有一点经验,关于[Django rest_framework ] Serializer中的create()、Views中的create()/perform_create()的区别,希望与诸君共讨之。


1 Serializer 序列化器

1.1 Serializer作用

序列化器是rest_framework 其中的一个组件,它有两个功能:

  • 序列化:把python中的对象转成json/xml格式字符串。这里的对象指的是数据库对象,因为rest_framework 用的ORM来操作数据库。它的功能直观上是将数据库里面的数据,通过接口传递到前端,因为使用ORM的缘故,从数据库到接口数据转换的过程被描述成序列化,其实更准确的描述应该是[可传输化]或者[转化为可以被前端直接使用的数据类型],这样更便于理解。
  • 反序列化:把json/xml格式字符串转成python中的对象。从功能上来说,反序列化是序列化的逆过程。但同样的,从英语到汉语直译的方式,总会带来各种理解上的障碍。更准确地描述,应该是[字符串对象化]或者[可存储化]。

和前后端不分离相比,Serializer承担了一部分views

2.2 Serializer中的create

序列化()的过程一般是read操作,绝大多数情况下应该不涉及使用create()。所以Serializer重写create()的情况只能是反序列化(字符串---->数据库),也就是将接口数据保存到数据库中。

  • Serializers中的create()方法

    
    from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):"""一个序列化器"""class Meta:model = MyModelfields = '__all__'# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)
    

    上面的这一小段代码,是一个典型的序列化器,在这里我们重写了Serializer的create()。可以看到在这里的create()方法有一个validated_data参数,这意味着什么呢,我想聪明的你已经猜到了答案:即这个数据是从前端传过来并且已经过了验证(valide)。经过了谁的验证呢,没错,是Serializer。可能许多人还记得Serializer提供了很多字段,类似models中的字段,当时我还在想,我说这玩意儿是用来干嘛的呢。现在回首,我想很多人像我一样,也已豁然开朗。记着,永远不要忘记Serializer的功能。举个例子:

    from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):"""一个序列化器"""class Meta:model = MyModelfields = '__all__'# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)# 定义的一个字段my_bool = BooleanField()
    

    上面我定义了一个字段:my_bool 。这个字段可接受的值是一个布尔值(0/1)。如果传其他值,则会报错。那么,很明显的,Serializer中重写create()方法的作用已然显现:对Serializer已校验的前端入参进行二次处理。默认情况下,serializer处理结束后,将会返回一个示例instance给视图(这一点存疑)。

到此Serializer的作用应该是结束了。


2 Views 视图

Serializer将校验成功的数据给到views,views拿到数据之后,用来做持久化

2.1 views中的create()与perform_create()

在views中你可以重写create(),并通过request.GET/request.POS/request.data拿到从前端传过来并经过Serializer规则校验的数据。
拿到之后呢?你可以对这些数据再次进行处理,或者将它作为调用其它接口的入参(这就是传说中的对其它系统的接口进行二次封装)。
视图中的create(),与序列化器中的create()有一个巨大的区别是:视图中的create()可以调用perform_create()进行持久化。这很棒棒,因为后端开发说白了就是对数据库进行增删改查(撇开使用不同框架的差异),而增删改查的难易程度事实上取决于你要解决的问题,即实际具体业务的复杂程度。


3 总结一下

  • Serializer主要是和前端打交道,so,基于这一点,你重写Serializer的create(),本质是为了过滤。如果通过了校验,并且满足你的要求,那么它会到视图中做下一步处理(通过过滤);反之,将会给前端反馈一些提示信息过去(被过滤)。
  • Views则相反,Views主要和后端打交道,你重写Views的create(),本质是为了持久化。在持久化之前,你可以对入参做任何符合实际情况的处理(包括调用其它接口),但是因为是POST/create(),最终你还是要持久化(perform_create())。

以上 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实现插入排序

什么是插入排序? 插入排序(Insertion Sort) 是一种简单且逐步构建有序序列的排序算法。它的思想是将数组分为两部分:已排序的部分和未排序的部分。初始时,已排序部分只包含数组的第一个元素,然后逐步将未排…

Process.Start 报错

Process.Start 报错 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 为什么会引发“系统找不到指定的文件”异常 Process.Start 报错 找不到路径 ,System.ComponentModel.Win32Exception:“系统找不到指定的文件。 问题1、 在WinForm中可能是权限问题&…

做了这件事,精准拿捏企业资产管理!

资产管理系统是一种为组织和个人提供管理各类资产的重要工具。无论是金融资产还是实物资产,这些都构成了一个实体或个人财务状况的重要组成部分。 无论是企业寻求优化其固定资产维护,还是个人希望更好地管理他们的投资组合,资产管理系统在现代…

NZ系列工具NZ02:VBA读取PDF使用说明

【分享成果,随喜正能量】时光绽放并蒂莲,更是一份殷殷嘱托,更是一份诚挚祝福,是一份时光馈赠,又是一份时光陪伴。。 我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解…

“深入解析JVM:探索Java虚拟机的工作原理与优化技巧“

标题:深入解析JVM:探索Java虚拟机的工作原理与优化技巧 摘要:本文将深入探讨Java虚拟机(JVM)的工作原理、内部结构以及如何优化Java应用程序的性能。我们将介绍JVM的主要组件,包括类加载器、运行时数据区域…

关于openssl SM2 ECC以及密钥生成和签名验签

SM2是基于ECC的国密算法,本身也是ECC算法。 openssl生成ECC公私钥并签名验签 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封装小程序请求

提要: uniapp项目引入uview库 此步骤不再阐述 1.创建环境文件 env.js: let BASE_URL;if (process.env.NODE_ENV development) {// 开发环境BASE_URL 请求地址; } else {// 生产环境BASE_URL 请求地址; }export default BASE_URL; 2.创建请求文件 该…

QLExpress动态脚本引擎解析工具

介绍 QLExpress脚本引擎 1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。 3、弱类型脚本…

广西Geotrust单位多域名https证书推荐

Geotrust是国际知名CA认证机构,根证书是Digicert,还有RapidSSL、QuickSSL等子品牌,拥有多种类型的多域名https证书,比如OV企业型https证书和EV增强型多域名https证书。那么,哪种多域名https证书更适合企事业单位使用呢…

SpringBoot复习:(43)如何以war包的形式运行SpringBoot程序

一、.pom.xml配置packging为war <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…

react如何实现数据渲染

React数据渲染是指将组件中的数据映射到页面上&#xff0c;以展示出来。在React中&#xff0c;数据渲染通常是通过JSX和组件的state或props完成的。 JSX是一个类似HTML的语法&#xff0c;可以在其中嵌入JavaScript表达式。在JSX中&#xff0c;可以使用{}包裹JavaScript表达式&…

解决C语言中使用scanf输入字符串导致for循环失效的问题

在C语言编程中&#xff0c;使用scanf函数输入字符串是一项基本操作。然而&#xff0c;当我们尝试在for循环中使用scanf输入字符串时&#xff0c;可能会遇到意外的问题&#xff0c;导致循环无法正常执行。本文将深入探讨这个问题&#xff0c;并提供解决方案&#xff0c;让你能够…

考公-判断推理-定义判断

第九节课 例题 例题 例题 例题 例题 例题 脚一滑&#xff0c;就是工伤&#xff0c;这难道不是操作不当吗 例题 不要较真&#xff0c;公务员&#xff0c;把没有全局观念的人排除在公务员队伍之外 例题 例题 下次看到不字&#xff0c;先给我画上 例题 例题 例题 例题…

微信群聊微信机器人实现流程

1.注册微信账号 要使用一个微信机器人账号来实现在微信群聊中的自动回复功能&#xff0c;你需要注册一个专门用于机器人的微信账号。 注册微信机器人账号的步骤如下&#xff1a; 下载微信&#xff1a;在手机或者电脑上下载并安装微信应用程序。创建新账号&#xff1a;打开微信…

力扣63.不同路径II(动态规划)

/*** author Limg* date 2022/08/09* 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。* 现在考虑网…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效&#xff0c;在其他页监听无效。 onLaunch&#xff1a;当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;on…

乡村振兴指数与其30余个原始变量数据(2000-2022年)

乡村振兴是当下经济学研究的热点之一&#xff0c;对乡村振兴进行测度&#xff0c;是研究基础。测度乡村振兴水平的学术论文广泛发表在《数量经济技术经济研究》等顶刊上。整理了2000-2022年城市层面的乡村振兴指数与其30余个原始变量数据&#xff0c;供大家使用。 数据来源&…

react-spring,一个react的动画库的使用

介绍 React Spring 是一个 spring physics based animation library 用于 React。它可以轻松地在 React 中实现弹性、渐变等动画效果。 使用 安装依赖&#xff1a; 使用npm&#xff1a; npm install react-spring 使用yarn&#xff1a; yarn add react-spring 导入和使用&a…

Opencv4基于C++基础入门笔记:OpenCV环境配置搭建

文章目录&#xff1a; 一&#xff1a;软件安装 二&#xff1a;配置环境&#xff08;配置完之后重启一下软件&#xff09; 1.配置电脑系统环境变量 vs2012及其以下 vs2014及其以上 2.配置VS软件环境变量 vs2012及其以下 vs2014及其以上 三&#xff1a;测试 vs2012及其…