Django DRF序列化器serializer
以下案例由浅到深,逐步深入,通过实例介绍了序列化器的使用方法,和遇到的常见问题的解决方法。
一、序列化器serializers.Serializer
1、urls.py
urlpatterns = [path("api/<str:version>/depart/",views.DepartView.as_view(),name="depart")
]
2、models.py
class Depart(models.Model):title = models.CharField(verbose_name="部门",max_length=32)order = models.IntegerField(verbose_name="顺序")count = models.IntegerField(verbose_name="人数")
3、views.py
from rest_framework import serializers# 自定义模型序列化器1:Serializer
class DepartSerializer(serializers.Serializer):# 字段名要与模型中的字段一致,需要哪个字段写哪个;title = serializers.CharField()count = serializers.IntegerField()class DepartView(APIView):def get(self,request,*args,**kwargs):# 1.数据库中获取数据queryset = models.Depart.objects.all()# 2.转换成JSON格式,mang=True表示有多个值,默认为False,有一个值;ser = DepartSerializer(instance=queryset,many=True)# 3.返回给用户,这里对数据进行了在包装,返回了一个状态值:statuscontext = {"status":True,"data":ser.data}return Response(context)
4、自定义模型序列化器时,可以继承ModeSerializer,操作起来就更方便;
# 自定义模型序列化器2:ModelSerializer
class DepartSerializer(serializers.ModelSerializer):class Meta:model = models.Depart# 模型中所有的字段都会拿过来,fields = "__all__"
二、模型中特殊字段序列化方法,如模型中的choices、ForeignKey、Datetime
1、urls.py
path("api/<str:version>/user/", views.UserView.as_view(), name="user")
2、models.py,这个表中模拟了常见的各种数据类型字段
class User(models.Model):name = models.CharField(verbose_name="姓名",max_length=32)age = models.IntegerField(verbose_name="年龄")gender = models.SmallIntegerField(verbose_name="性别",choices=((1,'男'),(2,'女')))depart = models.ForeignKey(verbose_name='部门',to='Depart',on_delete=models.CASCADE)ctime = models.DateTimeField(verbose_name="时间",auto_now_add=True)
3、views.py
# 自定义模型序列化器
class UserSerializer(serializers.ModelSerializer):# gender字段显示出来是整型,要想显示对应的string类型,需要自定义字段,字段名可以自己定义;# 这里主要是介绍 source的用法;用来解决模型中choices的问题;gender_text = serializers.CharField(source='get_gender_display')# 解决ForeignKey显示对应字段的问题;depart = serializers.CharField(source='depart.title')# 解决Datatime字段显示时间的问题,不设定格式显示的带毫秒ctime = serializers.DateTimeField(format='%Y-%m-%d')class Meta:model = models.User# fields = "__all__" # 显示所有字段fields = ['name','age','gender','gender_text','depart','ctime'] # 指定显示字段class UserView(APIView):def get(self,request,*args,**kwargs):# 1.获取数据;queryset = models.User.objects.all()# 2.序列化;ser = UserSerializer(instance=queryset,many=True)# 3.返回数据;context = {'status':True,'data':ser.data}return Response(context)
4、通过postman测试返回数据
三、在自定义模型序列化器中,通过自定义方法实现定制的返回值,get_xxx方法中return返回什么,xxx字段就会显示什么,后期开发中使用的还是比较多。
注:model.py、urls.py和上例相同,这里不再重复。
1、views.py
# 自定义模型序列化器
class UserSerializer(serializers.ModelSerializer):# gender字段显示出来是整型,要想显示对应的string类型,需要自定义字段,字段名可以自己定义;# 这里主要是介绍 source的用法;用来解决模型中choices的问题;gender_text = serializers.CharField(source='get_gender_display')# 解决ForeignKey显示对应字段的问题;depart = serializers.CharField(source='depart.title')# 解决Datatime字段显示时间的问题,不设定格式显示的带毫秒ctime = serializers.DateTimeField(format='%Y-%m-%d')# 自定义方法xxx = serializers.SerializerMethodField()class Meta:model = models.User# fields = "__all__" # 显示所有字段fields = ['name','age','gender','gender_text','depart','ctime','xxx'] # 指定显示字段def get_xxx(self,obj):return '{}-{}-{}'.format(obj.name,obj.age,obj.gender)class UserView(APIView):def get(self,request,*args,**kwargs):# 1.获取数据;queryset = models.User.objects.all()# 2.序列化;ser = UserSerializer(instance=queryset,many=True)# 3.返回数据;context = {'status':True,'data':ser.data}return Response(context)
2、返回数据展示
四、序列化中的嵌套,一般用来解决模型中ManyToMany和ForeignKey的处理
1、urls.py
path("api/<str:version>/depart/",views.DepartView.as_view(),name="depart"),path("api/<str:version>/user/", views.UserView.as_view(), name="user")
2、models.py
class Depart(models.Model):title = models.CharField(verbose_name="部门",max_length=32)order = models.IntegerField(verbose_name="顺序")count = models.IntegerField(verbose_name="人数")class Tag(models.Model):caption = models.CharField(verbose_name='标签',max_length=32)class User(models.Model):name = models.CharField(verbose_name="姓名",max_length=32)age = models.IntegerField(verbose_name="年龄")gender = models.SmallIntegerField(verbose_name="性别",choices=((1,'男'),(2,'女')))depart = models.ForeignKey(verbose_name='部门',to='Depart',on_delete=models.CASCADE)ctime = models.DateTimeField(verbose_name="时间",auto_now_add=True)# 创建多对多的关系tags = models.ManyToManyField(verbose_name='标签',to='Tag')
3、views.py
# 序列化器的嵌套,主要针对ForeignKey和ManyToMany# 自定义序列化器,序列化Depart表
class D1(serializers.ModelSerializer):class Meta:model = models.Departfields = ['id','title']# 自定义序列化器,序列化Tag表
class D2(serializers.ModelSerializer):class Meta:model = models.Tagfields = ['caption']class UserSerializer(serializers.ModelSerializer):depart = D1()# 标签这里是多对多的关系,所以还是要加上mangy=Truetags = D2(many=True)class Meta:model = models.User# fields = "__all__" # 显示所有字段fields = ['name','age','depart','tags']class UserView(APIView):def get(self,request,*args,**kwargs):# 1.获取数据;queryset = models.User.objects.all()# 2.序列化;ser = UserSerializer(instance=queryset,many=True)# 3.返回数据;context = {'status':True,'data':ser.data}return Response(context)
4、返回数据展示
五、序列化器的继承
1、urls.py
path("api/<str:version>/depart/",views.DepartView.as_view(),name="depart"),path("api/<str:version>/user/", views.UserView.as_view(), name="user")
2、models.py
class Depart(models.Model):title = models.CharField(verbose_name="部门",max_length=32)order = models.IntegerField(verbose_name="顺序")count = models.IntegerField(verbose_name="人数")class Tag(models.Model):caption = models.CharField(verbose_name='标签',max_length=32)class User(models.Model):name = models.CharField(verbose_name="姓名",max_length=32)age = models.IntegerField(verbose_name="年龄")gender = models.SmallIntegerField(verbose_name="性别",choices=((1,'男'),(2,'女')))depart = models.ForeignKey(verbose_name='部门',to='Depart',on_delete=models.CASCADE)ctime = models.DateTimeField(verbose_name="时间",auto_now_add=True)# 创建多对多的关系tags = models.ManyToManyField(verbose_name='标签',to='Tag')
3、views.py,Base是自定义的一个类,里面有一个字段是XX,source=‘name’,当UserSerializer继承了Base类的时候,可以直接使用XX字段。
class Base(serializers.Serializer):xx = serializers.CharField(source='name')class UserSerializer(serializers.ModelSerializer,Base):class Meta:model = models.User# fields = "__all__" # 显示所有字段fields = ['name','age','xx']class UserView(APIView):def get(self,request,*args,**kwargs):# 1.获取数据;queryset = models.User.objects.all()# 2.序列化;ser = UserSerializer(instance=queryset,many=True)# 3.返回数据;context = {'status':True,'data':ser.data}return Response(context)
4、返回数据展示
相关文章:

Django DRF序列化器serializer
以下案例由浅到深,逐步深入,通过实例介绍了序列化器的使用方法,和遇到的常见问题的解决方法。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…...

【开源】基于JAVA的衣物搭配系统
项目编号: S 016 ,文末获取源码。 \color{red}{项目编号:S016,文末获取源码。} 项目编号:S016,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…...

Spark---基于Standalone模式提交任务
Standalone模式两种提交任务方式 一、Standalone-client提交任务方式 1、提交命令 ./spark-submit --master spark://mynode1:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100 或者 ./spark-submit --master spark…...
webrtc的RTCPeerConnection使用
背景: 平时我们很少会需要使用到点对点单独的通讯,即p2p,一般都是点对服务端通讯,但p2p也有自己的好处,即通讯不经过服务端,从服务端角度这个省了带宽和压力,从客户端角度,通讯是安全,且快速的,当然有些情况下可能速度并不一定快。那么如何实现p2p呢? 解决办法: …...
【视觉SLAM十四讲学习笔记】第三讲——Eigen库
专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 本章将介绍视觉SLAM的基本问题之一:如何描述刚体在三维空间中的运动? Eigen…...

Ubuntu开机显示recovering journal,进入emergency mode
在一次正常的shutdown -r now之后,服务器启动不起来了,登录界面显示recovering journal,主要报错信息如下所示: /dev/sda2:recovering journal /dev/sda2:Clearn... You are in emergency mode. After logging in, type journalc…...

C++_String增删查改模拟实现
C_String增删查改模拟实现 前言一、string默认构造、析构函数、拷贝构造、赋值重载1.1 默认构造1.2 析构函数1.3 拷贝构造1.4 赋值重载 二、迭代器和范围for三、元素相关:operator[ ]四、容量相关:size、resize、capacity、reserve4.1 size、capacity4.2…...

LeeCode前端算法基础100题(2)- 最多水的容器
一、问题详情: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:…...

排序算法--归并排序
实现逻辑 ① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素 ② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素 ③ 重复步骤②,直到所有元素排序完毕 void pri…...

【LeetCode:1410. HTML 实体解析器 | 模拟+哈希表+字符串+库函数】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

基于SSM的公司仓库管理系统(有报告)。Javaee项目
演示视频: 基于SSM的公司仓库管理系统(有报告)。Javaee项目 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvc …...

spark数据倾斜的解决思路
数据倾斜是:多个分区中,某个分区的数据比其他分区的数据多的多 数据倾斜导致的问题: 导致某个spark任务耗时较长,导致整个任务耗时增加,甚至出现OOM运行速度慢:主要发生在shuffle阶段,同样的k…...

Python武器库开发-前端篇之html概述(二十八)
前端篇之html概述(二十八) html概述 HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式.被认为是互联网的核心技术之一。HTML产生于1990年,1997年HTML4成为互联网标准,…...

安防视频EasyCVR平台太阳能供电+4G摄像头视频监控方案的建设
在工地、光伏、风电站、水库河道等场景中,以及一些偏远地区的项目现场,会存在无网无电情况,大大制约了视频监控系统建设的效率及可行性。在这种场景中,我们也可以通过太阳能供电4G监控摄像机的方案,满足偏远地区无网无…...
12.位运算的性质(异或的性质)
文章目录 异或的性质求异或和问题[421. 数组中两个数的最大异或值](https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/)[2935. 找出强数对的最大异或值 II](https://leetcode.cn/problems/maximum-strong-pair-xor-ii/) 异或前缀和问题(最..回…...

国标直流充电枪9孔分别啥意思?
DC:直流电源正 DC-:直流电源负 PE:接地(搭铁)S:通讯CAN-H S-:通讯CAN-L CC1:充电连接确认 CC2:充电连接确认 A:12V A-:12V- 以上就是国标直流充电…...

关于 Google AMP 和 SEO
Google 于 2015 年首次推出 AMP,即加速移动页面。借助开源 AMP 框架,网页设计师可以制作快速加载的移动网页。该框架的创建是为了应对使用移动设备访问互联网的个人数量的增加。从那时起,谷歌一直在推动使用 AMP 来增强移动设备上的 SEO 和用…...

【SpringMVC】 对请求的不同响应
前言 本文学习如何运用不同的注解来返回不同的响应. 1.返回静态页面Controller 返回index.html页面 Controller 和 RestController的区别 controller 只有加上这个注解,Spring才会帮我们管理这个代码.后续我们访问时才能访问到. RestController 等同于 Controller ResponseBo…...

SQL进阶学习
1.[NISACTF 2022]join-us sql报错注入和联合注入 过滤: as IF rand() LEFT by updatesubstring handler union floor benchmark COLUMN UPDATE & sys.schema_auto_increment_columns && 11 database case AND right CAST FLOOR left updatexml DATABA…...
邦芒解析:做好职场规划防止跳槽失败
为了防止跳槽进入不适合自己的工作环境,你可以采取以下措施: 1、做好调研:在决定跳槽之前,尽可能了解新公司的情况。这包括公司的文化、工作氛围、发展前景以及团队成员之间的关系等。通过搜索公司网站、阅读员工评价以及与公司内…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...