当前位置: 首页 > news >正文

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())。

以上 。

相关文章:

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

Django rest_framework Serializer中的create、Views中的create/perform_create的区别 对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功…...

差异性分析傻瓜版

path1输入你的第一个Excel path2输入你的第二个Excel DEG.dig <- function(path1,path2) { require(xlsx) require(tidyverse) require(limma) require(edgeR) E<- read.xlsx (path1,sheetIndex 1,header 1) %>% column_to_rownames(var &…...

Keystone Automotive EDI 需求分析

Keystone Automotive 是一家知名的汽车零部件销售卖场&#xff0c;自创立以来&#xff0c;在汽车行业取得了卓越的成就。作为一家专业的汽车零部件供应商&#xff0c;Keystone Automotive 致力于为客户提供优质的产品和卓越的服务。公司的经营范围涵盖广泛&#xff0c;涉及多个…...

jmeter创建一个压测项目

1.jemeter新建一个项目&#xff1a; 2.接下来对Thread进行描述&#xff0c;也可以先使用默认的Thread进行操作。 3.添加http请求头的信息。按照如图所示操作 4.在请求头里面添加必要的字段&#xff0c;可以只填必要字段就可以 5.添加Http请求信息&#xff0c;如下图&#xff…...

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…...

AI Deep Reinforcement Learning Autonomous Driving(深度强化学习自动驾驶)

AI Deep Reinforcement Learning Autonomous Driving&#xff08;深度强化学习自动驾驶&#xff09; 背景介绍研究背景研究目的及意义项目设计内容算法介绍马尔可夫链及马尔可夫决策过程强化学习神经网络 仿真平台OpenAI gymTorcs配置GTA5 参数选择行动空间奖励函数 环境及软件…...

Java super

在Java中&#xff0c;关键字"super"用于引用一个类的父类。它可以有以下几种用法&#xff1a; 1. 访问父类成员&#xff1a;通过使用"super"后跟一个点&#xff0c;你可以从子类中访问父类的成员&#xff08;方法或字段&#xff09;。当子类重写一个方法或…...

【人工智能前沿弄潮】——生成式AI系列:Diffusers学习(1)了解Pipeline 、模型和scheduler

Diffusers旨在成为一个用户友好且灵活的工具箱&#xff0c;用于构建针对您的用例量身定制的扩散系统。工具箱的核心是模型和scheduler。虽然DiffusionPipeline为了方便起见将这些组件捆绑在一起&#xff0c;但您也可以拆分管道并单独使用模型和scheduler来创建新的扩散系统。 …...

TypeScript 非空断言

TypeScript 非空断言 发布于 2020-04-08 15:20:15 17.5K0 举报 一、非空断言有啥用 介绍非空断言前&#xff0c;先来看个示例&#xff1a; function sayHello(name: string | undefined) {let sname: string name; // Error } 对于以上代码&#xff0c;TypeScript 编译器…...

Python编程——谈谈函数的定义、调用与传入参数

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、理解函数 二、函数的定义 1、语法 2、定义一个…...

在Ubuntu中使用Docker启动MySQL8的天坑

写在前面 简介&#xff1a; lower_case_table_names 是mysql设置大小写是否敏感的一个参数。 1.参数说明&#xff1a; lower_case_table_names0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names 1 表名存储在磁盘是小写的&#xff0c;但是比较的时候是不区…...

Python3.x String内置函数大全

文章目录 总结一下Python3.x字符串的常用系统函数&#xff0c;总共分为8类1. 大小写字母转换类的函数str.capitalize()str.title()str.lower()str.upper()str.swapcase() 2. 统计类的函数str.count(str1, beg 0,endlen(string)) 3. 匹配类的函数str.endswith(suffix, beg0, end…...

Go异常处理机制panic和recover

recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数&#xff0c;然后将panic抛向上一层&#xff0c;直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃&#xff0c;recover只有被defer后才是有意义的。 func main() { p…...

QMainwindow窗口

QMainwindow窗口 菜单栏在二级菜单中输入中文的方法给菜单栏添加相应的动作使用QMenu类的API方法添加菜单项分隔符也是QAction类 工具栏状态栏停靠窗口 菜单栏 只能有一个, 位于窗口的最上方 关于顶级菜单可以直接在UI窗口中双击, 直接输入文本信息即可, 对应子菜单项也可以通…...

P5735 【深基7.例1】距离函数

题目描述 给出平面坐标上不在一条直线上三个点坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) (x1​,y1​),(x2​,y2​),(x3​,y3​)&#xff0c;坐标值是实数&#xff0c;且绝对值不超过 100.00&#xff0c;求围成的三角形周长。保留两…...

prometheus告警发送组件部署

一、前言 要实现Prometheus的告警发送需要通过alertmanager组件&#xff0c;当prometheus触发告警策略时&#xff0c;会将告警信息发送给alertmanager&#xff0c;然后alertmanager根据配置的策略发送到邮件或者钉钉中&#xff0c;发送到钉钉需要安装额外的prometheus-webhook…...

CAPL - XML和TestModule结合实现测试项可选

目录 目的:是否想实现如下面的功能呢? 一、.can和.cin文件中函数开发...

Latex安装与环境配置(TeXlive、TeXstudio与VS code的安装)编译器+编辑器与学习应用

TeXlive 配置Tex排版系统需要安装编译器+编辑器。TeX 的源代码是后缀为 .tex 的纯文本文件。使用任意纯文本编辑器,都可以修改 .tex 文件:包括 Windows 自带的记事本程序,也包括专为 TeX 设计的编辑器(TeXworks, TeXmaker, TeXstudio, WinEdt 等),还包括一些通用的文本编…...

STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数

今日学习使用STM32 C8T6的串口&#xff0c;我们在经过学习笔记2的总结归纳可知&#xff0c;STM32 C8T6最小系统板上有三路串口&#xff0c;如下图&#xff1a; 今日我们就着手学习如何配置开通这些串口进行收发&#xff0c;这里不讲串口通信概念与基础&#xff0c;可以自行网上…...

python中字符串内建函数篇4

一、ljust() 语法&#xff1a;str.ljust(width,[fillchar]) 参数说明&#xff1a; width – 指定字符串长度。 fillchar – 填充字符&#xff0c;默认为空格。 返回值&#xff1a;返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于原字符串…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...