九、Drf序列化器

九、序列化器

9.1序列化

从数据库取QuerySet或数据对象转换成JSON

9.1.1序列化器的简易使用
#新建一张部门表
class Depart(models.Model):title=models.CharField(verbose_name='部门',max_length=32)order=models.IntegerField(verbose_name='顺序')count=models.IntegerField(verbose_name='人数')
#新建路由
urlpatterns = [  path('api/<str:version>/depart/',views.DepartView.as_view(),name='depart'),]
#创建一个序列化器
from rest_framework import serializers
class DepartSerializers(serializers.Serializer):#部门系列化器,字段需要和数据库中的字段相对应title=serializers.CharField()order=serializers.IntegerField()count=serializers.IntegerField()
#创建视图类
class DepartView(APIView):#无需认证authentication_classes = []#部门视图类def get(self,request,*args,**kwargs):#1、获取数据库中的数据depart_obj=models.Depart.objects.all().first()#2、序列化器转换成JSONser_obj=DepartSerializers(instance=depart_obj)#打印ser_obj.data类型print('ser_obj.data.type:',type(ser_obj.data))#3、返回给用户context={'status':True,'data':ser_obj.data}return Response(context)

使用postman发送get请求进行测试

在这里插入图片描述

打印输出ser_obj.data的类型,是一个字典

ser_obj.data.type: <class 'rest_framework.utils.serializer_helpers.ReturnDict'>
9.1.2序列化QuerySet列表(多个数据对象)
#视图类
class DepartView(APIView):#无需认证authentication_classes = []#部门视图类def get(self,request,*args,**kwargs):#1、获取数据库中的数据#获取表中的所有记录(多个数据对象,是一个QuerySet列表)depart_objs=models.Depart.objects.all()#2、序列化器转换成JSON,many代表允许多个数据对象ser_obj=DepartSerializers(instance=depart_objs,many=True)print('ser_obj.data.type:',type(ser_obj.data))#3、返回给用户context={'status':True,'data':ser_obj.data}return Response(context)

使用postman发送GET请求进行测试

在这里插入图片描述

打印输出ser_obj.data的类型,是一个列表

ser_obj.data.type: <class 'rest_framework.utils.serializer_helpers.ReturnList'>
9.1.3ModelSerializer
#创建序列化器
from rest_framework import serializers
class DepartSerializers(serializers.ModelSerializer):#部门系列化器class Meta:model = models.Depart#获取数据库中的所有字段fields = "__all__"#指定字段# fields = ['title','order','count']#排除字段# exclude=['count']

这个效果同9.2.2中的效果

9.1.4特殊字段的处理
#表结构
class Depart(models.Model):#部门表title=models.CharField(verbose_name='部门',max_length=32)order=models.IntegerField(verbose_name='顺序')count=models.IntegerField(verbose_name='人数')class userInfo(models.Model):#员工信息表name=models.CharField(verbose_name='姓名',max_length=32)GENDER_CHOICES=((1,'男'),(2,'女'))#choices字段gender = models.SmallIntegerField(verbose_name='性别', choices=GENDER_CHOICES)#ForeignKey字段depart=models.ForeignKey(verbose_name='部门',to=Depart,on_delete=models.CASCADE)#DateTime字段ctime=models.DateTimeField(verbose_name='创建时间',auto_now=True)
#创建路由
urlpatterns = [   path('api/<str:version>/depart/',views.DepartView.as_view(),name='depart'),path('api/<str:version>/userinfo/',views.userInfoView.as_view(),name='userinfo'),  ]
#序列化器类
class UserInfoSerializers(serializers.ModelSerializer):#部门系列化器#新增一个choices字段,并获取choices中的文本gender_text=serializers.CharField(source='get_gender_display')#新增一个ForeignKey字段,并获取关联表中的文本depart_text=serializers.CharField(source='depart.title')#修改ctime类,并进行格式化ctime=serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")#新增一个数据库中不存在的字段xxx=serializers.SerializerMethodField()class Meta:model = models.userInfofields = ['name','gender','gender_text','depart','depart_text','ctime''xxx']def get_xxx(self,obj):#这个函数返回什么,xxx这个字段就等于什么。#obj代表当前数据对象,obj.name就是当前数据对象中的name字段值return 'I am {}'.format(obj.name)
#视图类
class userInfoView(APIView):# 用户视图类# 无需认证authentication_classes = []def get(self, request, *args, **kwargs):# 1、获取数据库中的数据# 多条数据userInfo_objs = models.userInfo.objects.all()# 2、序列化器转换成JSON,many代表允许多个数据对象ser_obj = UserInfoSerializers(instance=userInfo_objs, many=True)print('ser_obj.data.type:', type(ser_obj.data))# 3、返回给用户context = {'status': True,'data': ser_obj.data}return Response(context)

使用postman发送GET请求进行测试

在这里插入图片描述

9.1.5通过序列化器的嵌套来处理m2m字段
#表结构:
class Auther(models.Model):#著作表name=models.CharField(verbose_name='作者',max_length=32)class Book(models.Model):#图书表title=models.CharField(verbose_name='书名',max_length=128)#auther为MToM类型,并关联到Auther#一个著作可以有多本书auther=models.ManyToManyField(verbose_name='作者',to=Auther,related_name='books')
#创建url
urlpatterns = [path('api/<str:version>/auther/',views.AutherView.as_view(),name='auther'),p]
#图书序列化器
class BookSerializers(serializers.ModelSerializer):#书系列化器class Meta:model = models.Bookfields = '__all__'
#著作序列化器
class AutherSerializers(serializers.ModelSerializer):#著者系列化器#books字段通过上面创建的图书序列化器来进行序列化books=BookSerializers(many=True)class Meta:model = models.Autherfields = ['name','books']
#视图类
class AutherView(APIView):# 用户视图类# 无需认证authentication_classes = []def get(self, request, *args, **kwargs):# 1、获取数据库中的数据# 多条数据auther_objs = models.Auther.objects.all()# 2、序列化器转换成JSON,many代表允许多个数据对象ser_obj = AutherSerializers(instance=auther_objs, many=True)# print('ser_obj.data.type:', type(ser_obj.data))# 3、返回给用户context = {'status': True,'data': ser_obj.data}return Response(context)

通过postman发送请求进行测试

在这里插入图片描述

9.1.6序列化器的继承
class BaseSerializers(serializers.Serializer):#基础序列化器#这里定义了一个xxx字段,数据来源是数据对象中的name属性xxx=serializers.CharField(source='name')
class BookSerializers(serializers.ModelSerializer):#书系列化器class Meta:model = models.Bookfields = '__all__'class AutherSerializers(serializers.ModelSerializer,BaseSerializers):#这个序列化器继承了BaseSerializers,所以也可以使用BaseSerializers中的xxx字段#著者系列化器books=BookSerializers(many=True)class Meta:model = models.Autherfields = ['name','books','xxx']

9.2使用序列化器校验数据

9.2.1基本校验
#创建url
urlpatterns = [   path('login/', views.LoginView.as_view()),   ]
#创建序列化器
class LoginSerializers(serializers.Serializer):#required=True代表不允许为空,默认值就是Truename=serializers.CharField(required=True)password=serializers.CharField(required=True)
#视图类
class LoginView(MyAPIView):#用户登入,不需要认证authentication_classes = []def post(self,request):#序列化用户传递过来的数据ser_obj=LoginSerializers(data=request.data)if ser_obj.is_valid():#如果数据有效,则将有效的数据返回给用户return Response(ser_obj.validated_data)#如果数据无效,则返回错误信息return Response(ser_obj.errors)

使用postman进行测试

在这里插入图片描述
在这里插入图片描述

9.2.2内置检验和正则表示式检验
#创建序列化器
from rest_framework import serializers
from django.core.validators import RegexValidator
class LoginSerializers(serializers.Serializer):name=serializers.CharField(required=True)#password字段最大长度为32,最小长度为8password=serializers.CharField(required=True,max_length=32,min_length=8)#order字段最大值为100,最小值为10order=serializers.IntegerField(required=False,max_value=100,min_value=10)#gender只允许为1或2gender=serializers.ChoiceField(choices=((1,'男'),(2,'女')))#EmailField必须输入Email格式的数据email=serializers.EmailField(required=True)#手机号字段使用正则表达式检验,必须满足正则表达式的规则才能通过校验mobilePhone=serializers.CharField(validators=[RegexValidator(r'^(1[3|4|5|6|7|8|9])\d{9}$','手机号格式错误')])

使用postman进行测试

在这里插入图片描述

9.2.3钩子校验
#序列化器
from rest_framework import serializers
from rest_framework import exceptions
class LoginSerializers(serializers.Serializer):name=serializers.CharField(required=True)password=serializers.CharField(required=True,max_length=32,min_length=6)def validate_name(self,value):#对某个字段进行钩子检验user_obj=models.User.objects.filter(name=value).first()if not user_obj:#如果用户名不存在,则抛出错误信息raise exceptions.ValidationError("用户名不存在")return valuedef validate(self, attrs):#全局中钩子检验name=attrs.get('name')password=attrs.get('password')user_obj=models.User.objects.filter(name=name,password=password).first()if not user_obj:#如果密码错误不存在,则抛出错误信息raise exceptions.ValidationError('密码错误')return attrs
9.2.4ModelSerializer进行数据校验
#创建Model序列化器(用于数据校验)
class RegisterModelSerializers(serializers.ModelSerializer):confirm_password=serializers.CharField(required=True)class Meta:model=models.Userfields=['name','password','confirm_password','depart']extra_kwargs={#为各个字段添加参数'name': {'max_length':32,'min_length':2},'password': {'validators':[RegexValidator(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$')]},}def validate_confirm_password(self, value):#确认密码钩子校验password=self.initial_data.get('password',None)if password != value:raise exceptions.ValidationError('两次输入密码不一致')return value
#创建Model序列化器(用于序列化返回给用户的数据)
class UserSerializers(serializers.ModelSerializer):#role是chioces字段,这里可以获取它的文本内容role=serializers.CharField(source='get_role_display')#depart是ForeignKey字段,这里可以获取它的文本内容depart=serializers.CharField(source='depart.title')class Meta:model=models.Userfields=["name","role","depart"]
#视图类
class RegisterViews(APIView):# 用户登入,不需要认证authentication_classes = []def post(self,request):#通过序列化器校验用户传递过来的数据ser_obj=RegisterModelSerializers(data=request.data)#判断校验是否通过if ser_obj.is_valid():#如果校验通过,则删除数据库中不存在的字段,添加数据库中存在但用户未传递的字段ser_obj.validated_data.pop("confirm_password")instance=ser_obj.save(role=3)#通过序列化器序列化存入数据库中的数据,并返回给用户data = UserSerializers(instance=instance).datareturn Response(data)return Response(ser_obj.errors)

使用postman进行测试

在这里插入图片描述

9.2.5使用一个序列化器既做校验又做序列化
#创建序列化器
class RegisterModelSerializers(serializers.ModelSerializer):#write_only=True代表只做校验,不做序列化confirm_password=serializers.CharField(required=True,write_only=True)#read_only=True代表只做序列化,不做校验role_text = serializers.CharField(source='get_role_display',read_only=True)depart_text=serializers.CharField(source='depart.title',read_only=True)class Meta:model=models.Userfields=['name','password','confirm_password','role_text','depart','depart_text']extra_kwargs={#为各个字段添加参数'name': {'max_length':32,'min_length':2},#write_only=True代表只做校验,不做序列化'password': {"write_only":True,'validators':[RegexValidator(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$')]},#write_only=True代表只做校验,不做序列化'depart':{"write_only":True}}def validate_confirm_password(self, value):#确认密码钩子校验password=self.initial_data.get('password',None)if password != value:raise exceptions.ValidationError('两次输入密码不一致')return value
#视图类
class RegisterViews(APIView):# 用户登入,不需要认证authentication_classes = []def post(self,request):ser_obj=RegisterModelSerializers(data=request.data)if ser_obj.is_valid():ser_obj.validated_data.pop("confirm_password")ser_obj.save(role=3)return Response(ser_obj.data)return Response(ser_obj.errors)

使用postman测试

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试学习笔记丨allure学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 安装与下载 需要下载本地文件&#xff0c;并且添加到环境变量里 windows&#xff1a;下载&#xff0c;解压&#xff0c;并配置环境变量 mac&#xff1a;brew install allure 环境变量…

Docsify搭建个人博客

前提&#xff1a;电脑安装了Node.js 安装到本地 CMD命令下输入node -v查看是否已经安装了Node.js 安装docsify-cli工具&#xff1a;npm i docsify-cli -g 使用git下载docsify-Plus项目&#xff0c;Gitee地址&#xff1a;https://gitee.com/librarycodes/docsify-plus cd…

Linux的启动流程、移植到开发板

1、linux驱动开发与裸机开发的区别 Linux系统驱动和裸机驱动的主要区别在于运行时的环境和依赖。Linux系统驱动依赖于Linux内核提供的API和服务&#xff0c;而裸机驱动则是在没有操作系统支持的情况下直接与硬件交互。因此&#xff0c;两者的开发和调试方法也有很大差异。 2、…

【H2O2|全栈】关于CSS(11)flex——更加优雅的布局

目录 CSS3入门 前言 准备工作 布局优化 如何使用flex布局 容器与成员 概念 轴线 容器的属性 成员的属性 预告和回顾 后话 CSS3入门 前言 本系列博客主要介绍CSS有关知识点&#xff0c;当前章节讲述CSS3相关内容。 本章节讲述flex布局的相关知识。 部分内容仅代…

PCB缺陷检测数据集 xml 可转yolo格式 ,共10688张图片

PCB缺陷检测数据集&#xff08;yolov5,v7,v8&#xff09; 数据集总共有两个文件夹&#xff0c;一个是pcb整体标注&#xff0c;一个是pcb部分截图。 整体标注有6个分类&#xff0c;开路&#xff0c;短路等都已经标注&#xff0c;标注格式为xml&#xff0c;每个文件夹下有100多张…

【实时计算 Flink】SQL作业大状态导致反压的调优原理与方法

状态管理不仅影响应用的性能&#xff0c;还关系到系统的稳定性和资源的有效利用。如果状态管理不当&#xff0c;可能会导致性能下降、资源耗尽&#xff0c;甚至系统崩溃。本文为您介绍SQL作业大状态导致反压的调优原理与方法。 运行原理&#xff1a;状态算子的产生 作为一种特…

【Python】Twisted:让自定义网络应用开发变得简单

Twisted 是 Python 中一个成熟、功能强大的事件驱动网络编程框架。它支持多种协议&#xff0c;如 HTTP、FTP、SMTP 等&#xff0c;可以用于构建高性能的网络应用&#xff0c;包括网络服务器、客户端、代理服务器等。Twisted 的核心是基于事件驱动模型&#xff0c;能够有效处理大…

基于方块编码的图像压缩matlab仿真,带GUI界面

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 编码单元的表示 4.2编码单元的编码 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 下图是随着方块大小的变化&#xff0c;图像的压缩率以及对应的图像质量指标PSN…

Python OpenCV精讲系列 - 三维重建深入理解(十七)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

SpringBoot项目-Thymeleaf安装

SpringBoot项目-Thymeleaf安装 参考文章:SpringBoot 整合Thymeleaf教程及使用方法 参考视频:模板引擎Thymeleaf快速入门 其实,参考的文章和视频,他们丢失了一些细节,我搞的时候还是有错 第1步:pom.xml增加依赖 <!-- SpringBoot集成thymeleaf模板 --><depe

QD1-P6 HTML常用标签:列表

本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p6 ‍ 本节学习HTML列表标签。HTML 列表有多种形式&#xff0c;最重要的有两种&#xff1a; 有序列表无序列表 一、有序列表 1.1 写法 <ol><li>首先</li><li>其次</li><li>最…

Window11 安装Java21教程

随着Java版本的迭代&#xff0c;最新的长期支持版本已经更新到Java21了&#xff0c;虽然笔者许多代码还是当年用Java8写的&#xff0c;但抱残守缺从来不适合IT人员&#xff0c;该来的我们始终要欣然面对。 其实随着各项技术的发展&#xff0c;Java许多组件现在其实都不需要或者…

Linux shell编程学习笔记86:sensors命令——硬件体温计

0 引言 同事们使用的Windows系统电脑&#xff0c;经常莫名其妙地装上了鲁大师&#xff0c;鲁大师的一项功能是显示系统cpu等硬件的温度。 在Linux系统中&#xff0c;sensors命令可以提供类似的功能。 1 sensors命令 的安装和配置 1.1 sensors命令 的安装 要使用sensors命…

华为OD机试 - 单向链表中间节点(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

使用Spring Security实现用户-角色-资源的权限控制

文章目录 一、基于角色的请求控制二、加载用户角色信息三、角色与资源的关联四、测试角色权限控制1. 未登录用户访问受保护资源2. 登录用户访问受保护资源3. 角色不足的用户访问受保护资源&#xff08;把前面改成.roles("USER")&#xff09; 五、自定义异常处理1. 自…

数学建模算法与应用 第3章 非线性规划及其求解方法

目录 3.1 非线性规划概述 3.2 约束优化问题 3.3 无约束优化问题的Matlab求解 3.4 牛顿法与梯度下降法 Matlab代码示例&#xff1a;梯度下降法求解简单非线性问题 3.5 非线性规划在机器学习中的应用 习题 3 总结 非线性规划&#xff08;Nonlinear Programming, NLP&…

华为OD机试 - 人数最多的站点(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

A2P云短信,是什么意思?

中国联通国际公司产品之 A2P 云短信 一站式国际通信服务&#xff0c;助力企业拓展国际业务&#xff0c;轻松触达全球客户 在全球化日益加深的今天&#xff0c;企业要想在竞争激烈的国际市场中脱颖而出&#xff0c;不仅需要优质的产品和服务&#xff0c;更需要高效的沟通渠道来…

系统架构设计师 - 案例特训专题 - 架构设计篇

案例特训专题 - 架构设计篇 架构设计篇软件架构风格 ★★★★质量属性与架构评估 ★★★★★Web 架构综合考查 ★★★★★单台机器到数据库与Web服务器分离应用服务器集群负载均衡技术Session共享机制持久化技术 ORM数据库读写分离化缓存常见缓存技术Redis 集群切片的常见方式R…

DAMA数据管理知识体系(第5章 数据建模和设计)

课本内容 5.1 引言 概要 常见6种数据模式 关系模式多维模式面向对象模式事实模式时间序列模式NoSQL模式按照描述详细程度不同分类 概念模型逻辑模型物理模型包含组件 实体、关系、事实、键、属性业务驱动因素 1&#xff09;提供有关数据的通用词汇表。2&#xff09;获取、记录组…