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、做好调研:在决定跳槽之前,尽可能了解新公司的情况。这包括公司的文化、工作氛围、发展前景以及团队成员之间的关系等。通过搜索公司网站、阅读员工评价以及与公司内…...
5款机器学习模型可视化工具实战评测与应用指南
1. 机器学习模型可视化工具的价值与挑战在模型开发过程中,可视化工具就像给算法装上了X光机。三年前我参与一个金融风控项目时,曾花费两周时间调试一个准确率卡在89%的随机森林模型。直到使用了SHAP可视化工具,才发现某个特征的分箱方式导致模…...
图记忆技术:构建LLM智能体的结构化记忆系统
1. 项目概述:图记忆库的兴起与价值如果你最近在关注大语言模型(LLM)和智能体(Agent)的前沿进展,那么“图”这个概念一定频繁地出现在你的视野里。从知识图谱到图神经网络,再到现在的图记忆&…...
3分钟解锁网易云音乐加密文件:ncmdumpGUI终极解密秘籍
3分钟解锁网易云音乐加密文件:ncmdumpGUI终极解密秘籍 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐精心收藏了数百首心仪歌…...
2026届毕业生推荐的十大降重复率网站推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把文本中AIGC的显性特征有效降低,得从语义逻辑、句式结构、词汇选择这三个方面开…...
NVIDIA Nemotron如何优化RAG系统的查询重写技术
1. RAG系统面临的挑战与NVIDIA Nemotron的解决方案 检索增强生成(RAG)系统在实际应用中面临的核心难题是用户查询的模糊性和隐含意图。当用户提出"告诉我NVIDIA NeMo模型训练的最新更新"这样的问题时,系统很难准确判断用户真正关心…...
【限时公开】某头部交易所MCP网关核心模块源码(含TLS1.3卸载、动态路由热加载、熔断指标埋点)
更多请点击: https://intelliparadigm.com 第一章:MCP网关架构设计与高性能通信模型概览 MCP(Microservice Communication Protocol)网关是面向云原生微服务生态构建的统一通信中枢,其核心目标是在异构协议、多语言服…...
无需越狱!用Misaka彻底解放iPhone和tvOS个性化定制能力 [特殊字符]
无需越狱!用Misaka彻底解放iPhone和tvOS个性化定制能力 🚀 【免费下载链接】misaka iOS & tvOS customisation tool for KFD & MDC 项目地址: https://gitcode.com/gh_mirrors/mis/misaka 想让你的iPhone焕然一新却不想冒险越狱…...
(课堂笔记)Oracle 常用函数:数值、字符串、日期处理
本文系统总结了Oracle常用函数,分为数值、字符串和日期处理三大类。数值函数包括ABS、POWER、ROUND等;字符串函数涵盖REPLACE、SUBSTR、INSTR等;日期函数包含LAST_DAY、ADD_MONTHS等。文中提供了典型示例和实用技巧,如统计字符出现…...
Kubernetes 垃圾收集(Garbage Collection)完全指南:对象生命周期管理
Kubernetes 垃圾收集(Garbage Collection)完全指南:对象生命周期管理 1. Owner 和 Dependent(所有者与依赖对象) 1.1 核心概念Owner(所有者):Kubernetes 中部分对象可作为其他对象的…...
AiPy帮我工作后,我开始躺平摸鱼
作为一名某互联网公司摸爬滚打三年的运营分析师,我最近上班幸福感直线上升——没有涨工资,leader也没有请假,是因为我找到工作摸鱼的真神:AiPy。体验了不到一个月,就已经为我解决了太多工作痛点,让我从无休…...
