九、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、序列化器转换成JSON
        ser_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.userInfo
        fields = ['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.Book
        fields = '__all__'
#著作序列化器
class AutherSerializers(serializers.ModelSerializer):
    #著者系列化器
    #books字段通过上面创建的图书序列化器来进行序列化
    books=BookSerializers(many=True)
    class Meta:
        model = models.Auther
        fields = ['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.Book
        fields = '__all__'

class AutherSerializers(serializers.ModelSerializer,BaseSerializers):
    #这个序列化器继承了BaseSerializers,所以也可以使用BaseSerializers中的xxx字段
    #著者系列化器
    books=BookSerializers(many=True)
    class Meta:
        model = models.Auther
        fields = ['name','books','xxx']

9.2使用序列化器校验数据

9.2.1基本校验
#创建url
urlpatterns = [   
    path('login/', views.LoginView.as_view()),   

]
#创建序列化器
class LoginSerializers(serializers.Serializer):
    #required=True代表不允许为空,默认值就是True
    name=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,最小长度为8
    password=serializers.CharField(required=True,max_length=32,min_length=8)
    #order字段最大值为100,最小值为10
    order=serializers.IntegerField(required=False,max_value=100,min_value=10)
    #gender只允许为1或2
    gender=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 value
    def 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.User
        fields=['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.User
        fields=["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).data
            return 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.User
        fields=['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.mfbz.cn/a/888502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言_内存函数

内存函数是 C 标准库中的一组函数&#xff0c;用于管理和操作内存。使用时需要包含头文件<string.h>。 1. memcpy的使用和模拟实现 函数形式如下&#xff1a; void* memcpy(void* destination, const void* source, size_tnum);函数解析和注意事项&#xff1a; memcp…

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

AWS EC2 部署Echarts大屏展示项目

前言 Echarts简介 ECharts是一个由JavaScript开发的开源可视化库。它能使数据生动、直观、互动、高度个性化数据可视化图表。ECharts适用大部分浏览器&#xff0c;如IE6 、Chrome、Firefox、Safari等&#xff0c;同时支持PC和移动设备。 开源&#xff1a;ECharts是一个开源项目…

【JavaEE】——文件IO

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;认识文件 1&#xff1a;文件的概念 2&#xff1a;文件的结构 3&#xff1a;文件路径…

矩阵求解复数(aniwoth求解串扰)

所以这种求解串扰的格式是因为&#xff0c;有串扰的共轭项在方程组中 复数共轭项的作用&#xff0c;但是这是二次方程&#xff0c;

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

算法知识点————贪心

贪心&#xff1a;只考虑局部最优解&#xff0c;不考虑全部最优解。有时候得不到最优解。 DP&#xff1a;考虑全局最优解。DP的特点&#xff1a;无后效性&#xff08;正在求解的时候不关心前面的解是怎么求的&#xff09;&#xff1b; 二者都是在求最优解的&#xff0c;都有最优…

微服务实战——ElasticSearch(保存)

商品上架——ElasticSearch&#xff08;保存&#xff09; 0.商城架构图 1.商品Mapping 分析&#xff1a;商品上架在 es 中是存 sku 还是 spu &#xff1f; 检索的时候输入名字&#xff0c;是需要按照 sku 的 title 进行全文检索的检索使用商品规格&#xff0c;规格是 spu 的…

No package nodejs available.No package npm available.

安装nodejs时出现的报错 这个错误的原因是当前的 yum 源没有包含 Node.js 和 npm 的安装包。 解决方法 使用 NodeSource 仓库 curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -运行 yum install 安装 Node.js 和 npm&#xff1a; yum install -y nodejs使用 E…

深入了解Oracle OCP认证,开启数据库专业之旅

使用Oracle数据库的公司内部&#xff0c;经常有员工们在讨论OCP认证(Oracle Certified Professional&#xff0c;Oracle认证专家)&#xff0c;这是甲骨文Oracle公司提供的一种专业认证&#xff0c;认证用于使用者在Oracle技术领域的专业知识和技能。 在这里&#xff0c;有一点…

华为、华三、锐捷网络设备的常用命令整理

华为&#xff08;Huawei&#xff09;、华三&#xff08;H3C&#xff09;、锐捷&#xff08;Ruijie&#xff09;常用网络设备命令&#xff1a; 华为&#xff08;Huawei&#xff09; 查看设备的信息&#xff0c;可执行“display version”命令。 查看当下的配置&#xff0c;则…

动手学深度学习9.3. 深度循环神经网络-笔记练习(PyTorch)

本节课程地址&#xff1a;58 深层循环神经网络【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;9.3. 深度循环神经网络 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptr…

计算机毕业设计Tensorflow交通标志识别检测 车流量预测 车速检测 自动驾驶 机器学习 深度学习 人工智能 PyTorch 大数据毕设

《Tensorflow交通标志识别检测》开题报告 一、研究背景及意义 随着智能交通系统和无人驾驶技术的快速发展&#xff0c;交通标志识别系统成为智能驾驶系统的重要组成部分。传统的交通标志识别方法主要依赖于人工检查和识别&#xff0c;存在效率低下、易受主观因素影响等问题。…

聚观早报 | 苹果重磅更新;OpenAI推出ChatGPT Canvas

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 10月1日消息 苹果重磅更新 OpenAI推出ChatGPT Canvas Meta发布Movie Gen iQOO 13影像规格曝光 华为HarmonyOS N…

高效微调理解(prompt-tuning,p-tuning v1,p-tuning v2,lora)

高效微调&#xff08;prompt-tuning&#xff0c;p-tuning v1&#xff0c;p-tuning v2&#xff0c;lora&#xff09; 1.prompt-tuning&#xff1a; 例子理解&#xff1b;保持原本模型参数不变&#xff0c;通过训练提示词的参数调整prompt&#xff0c;使其与下游任务匹配。 例子…

计算机毕业设计 基于Django的在线考试系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络&#xff0c;人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队&#xff0c;提升工作效率&#xff0c;甚至影响职业发展。在职场中&#xff0c;我们需要了解一些关键要素&#xff0c;以更好地处理人际关系&#xf…

[C++]使用纯opencv部署yolov11-cls图像分类onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-cls图像分类ONNX模型是一项具有挑战性的任务&#xff0c;因为YOLOv11通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff0c;可以通过一些间接的方法来实现这一目标&am…

【MySQL】Ubuntu环境下MySQL的安装与卸载

目录 1.MYSQL的安装 2.MySQL的登录 3.MYSQL的卸载 4.设置配置文件 1.MYSQL的安装 首先我们要看看我们环境里面有没有已经安装好的MySQL 我们发现是默认是没有的。 我们还可以通过下面这个命令来确认有没有mysql的安装包 首先我们得知道我们当前的系统版本是什么 lsb_…

Pikachu-Cross-Site Scripting-DOM型xss

DOM型xss DOM型XSS漏洞是一种特殊类型的XSS,是基于文档对象模型 Document Object Model (DOM)的一种漏洞。是一个与平台、编程语言无关的接口&#xff0c;它允许程序或脚本动态地访问和更新文档内容、结构和样式&#xff0c;处理后的结果能够成为显示页面的一部分。 dom就是一…