【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值

我们经常会遇到下面这种情况:
序列化器用的是ModelSerializer,写视图的时候继承的是generics.CreateAPIView。现在我想在正式提交到数据库(perform_create)之前,修改几个字段的值,应该怎么去做呢?


在这里插入图片描述


目录

  • 【django framework】ModelSerializer+GenericAPIView,如何在提交前修改某些字段值
  • 1 在Serializer序列化器中重写create
  • 2 继承generics.CreateAPIView后,重写perform_create()


1 在Serializer序列化器中重写create

我们知道序列化器承担了部分视图的作用,但是它主要的作用有两个:
对序列化进来的数据进行校验,比如validate一下手机号格式是不是正确
写入一些默认或者不需要前端传递的字段
// 如果说执意要在Serializer中写业务逻辑,也可以。只不过这种写法会和rest_framework的设计理念相违背,增加了序列化器和视图的耦合性

from rest_framework import serializers
from .models import *
import reclass YourModelSerializer(serializers.ModelSerializer):"""YourModel 创建 序列化器"""class Meta:model = YourModelfields = '__all__'def validate(self, kwargs):"""校验校验前端传过来的用户手机号格式对不对"""MOBILE = kwargs.get('mobile').mobileREGEX_MOBILE = '1[3475698]\d{9}$|^147\d{8}$|^176\d{8}|^198\d{8}$'# 客户手机号格式if not re.match(REGEX_MOBILE, MOBILE):raise serializers.ValidationError("客户手机号格式有误")return kwargsdef create(self, validated_data):"""重写create方法// 添加唯一序列号序列号不需要前端传递"""# 唯一序列号validated_data['serial'] = 'serial102356478'# 可以在此写业务逻辑,但是并不推荐return super().create(validated_data)

2 继承generics.CreateAPIView后,重写perform_create()

秉承着谁的活由谁来干的原则,第一种方法虽然可行,但是增加了序列化器与视图之间的耦合性,所以并不是一个好方法。
所以我们通过重写perform_create()方法来修改我们想要修改的字段
而视图本就是写业务逻辑的,这也符合rest_framework设计初衷。

from rest_framework import generics
from .models import YourModel
from .serializers import YourModelSerializerclass YourModelCreateAPIView(generics.CreateAPIView):queryset = YourModel.objects.all()serializer_class = YourModelSerializerdef perform_create(self, serializer):# 获取需要修改的字段的值some_field_value = serializer.validated_data.get('field_name')# 修改字段的值modified_field_value = some_field_value + '_modified'# 更新字段的值serializer.validated_data['some_field'] = modified_field_value# 继续调用serializer的save方法保存对象serializer.save()

如此,即完成了功能,又不破坏框架功能模块间的耦合性,而代码的质量也由此而提升,皆大欢喜。

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

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

相关文章

【Javase基础语法】String类常见的字符串操作方法

引言 个人主页:努力学编程-CSDN博客 学习领域:C语言进阶,javase基础语法 每日鸡汤:爱意随风起,人生不言弃 字符串的定义: public static void main(String[] args) { // 使用常量串构造 String s1 "h…

接口测试之文件下载

在工作中对于下载接口,经常会有这样的疑问:这类接口一般功能比较稳定,但是又比较重要,需要占用回归测试时间,有没有可替代的方式? 答案肯定是有的,可以从接口测试/UI自动化测试介入&#xff0c…

01——LenNet网络结构,图片识别

目录 1、model.py文件 (预训练的模型) 2、train.py文件(会产生训练好的.th文件) 3、predict.py文件(预测文件) 4、结果展示: 1、model.py文件 (预训练的模型) impor…

Navicat破解 Navicat下载安装 附教程 免费

百度网盘:https://pan.baidu.com/s/1wRRN_18_uXxPiIWCS4l43A 麻烦各位师傅帮忙填写一下问卷,提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 (资料来源于网络,侵告删)

ThreeJs 可视化大屏地图

效果图: 今天给各位提供一个可视化地图的案例和源码,关注下吧各位!回复"大屏地图" 获取工程 1、案例分析:主要使用了UI 美工图片,然后获取地图的json 数据绘制图形,贴图使用该区域的地图纹理进行…

git push解决办法:! [remote rejected] prod -> prod (pre-receive hook declined)

今天想把最近改的东西上传到Gogs上发版一下子的,但是发现有冲突合并不了,于是我切回自己的分支合并了prod,把冲突处理了一下子,还又增加了一点修改,push后.......又回到prod进行git push,哦豁~这就出了问题…

编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等,并不能覆盖所有的需求,我们之前讲过很少用到的因果图法,下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口,每个…

mysql主从复制/主从备份搭建

mysql主从复制/主从备份搭建 前言一、主从复制1)为什么使用主从复制、读写分离?2)主从复制原理 二、如何实现主从复制?1)主库配置1、修改配置文件2、登录mysql: 2)从库配置1、修改配置文件2、登…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

复现文件上传漏洞

一、搭建upload-labs环境 将下载好的upload-labs的压缩包&#xff0c;将此压缩包解压到WWW中&#xff0c;并将名称修改为upload&#xff0c;同时也要在upload文件中建立一个upload的文件。 然后在浏览器网址栏输入&#xff1a;127.0.0.1/upload进入靶场。 第一关 选择上传文件…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

spacy进行简单的自然语言处理的学习

自然语言处理基本概念 概念&#xff1a;自然语言处理&#xff0c;是让机器理解人的语言的过程。 作用&#xff1a;通过使用自然语言处理&#xff0c;机器可以理解人的语言&#xff0c;从而进行语义分析&#xff0c;例如&#xff1a;从一句话中判断喜怒哀乐&#xff1b;从一段文…

汽车电子零部件(3):ADAS前视感知系统FLC

前言: 比如车道保持和车道改变这种场景,如何进行车道的识别,如何进行周围车辆的识别,这算是ADAS中的一个场景,其中就会用到FLC前视感知系统。还有比如前向物体识别,前向车辆识别等。 再往大里说那就是车联网了: 除了前向也可能有其他部位

opencv安装(C++)并配置vs

准备工作&#xff1a; 1.opencv安装包(此教程使用4.9) 2.visual studio(此教程使用vs2019) opencv安装&#xff1a; 1、下载opencv&#xff1a; 1.1 官网下载&#xff1a;Releases - OpenCV 1.2 百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1NpEoFjbbyQJtFD…

【Java】List, Set, Queue, Map 区别?

目录 List, Set, Queue, Map 区别&#xff1f; Collection和Collections List ArrayList 和 Array区别&#xff1f; ArrayList与LinkedList区别? ArrayList 能添加null吗&#xff1f; ArrayList 插入和删除时间复杂度&#xff1f; LinkedList 插入和删除时间复杂度&…

【C++】string进一步介绍

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 迭代器2.1 反向迭代器2.2 const对象迭代器 3. Capacity3.1 size和length3.2 max_size3.3 capacity3.4 clear3.5 shrink_to_fit &#xff08;了解即可&#xff09;3.6 reserve3.7 resize 4. Element access4…

Java面向对象案例之描述专业和学生(4)

类的方法图 学生类&#xff1a; 属性&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;所学习的专业方法&#xff1a;学习的方法&#xff0c;描述学习状态。描述内容包括姓名、学号、年龄、所学习的专业信息 专业类&#xff1a; 属性&#xff1a;专业编号&#xf…

Vue 3中的reactive:响应式状态的全面管理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)2D变换编辑器0. 程序简介环境说明程序流程 1. 各种变换平移变换旋转变换等比缩放变换缩放变换镜像变换剪切变换 2. 按钮按钮类创建按钮 3. Pygam…

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP&#xff0c;MVC架构开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …