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.返回给用户,这里对数据进行了在包装,返回了一个状态值:status
        context = {"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.Depart
        fields = ['id','title']

# 自定义序列化器,序列化Tag表
class D2(serializers.ModelSerializer):
    class Meta:
        model = models.Tag
        fields = ['caption']

class UserSerializer(serializers.ModelSerializer):
    depart = D1()
    # 标签这里是多对多的关系,所以还是要加上mangy=True
    tags = 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、返回数据展示 

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

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

相关文章

Banana Pi [BPi-R3-Mini] 回顾和主线 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830&#xff08;4 个 A53&#xff0c;最高 2.0 GHz&#xff09;&#xff0c;具有 2 个 2.5 GbE、AX4200 2.4G/5G 无线和 USB 2.0 端口。它还具有两个 M.2 连接器&#xff0c;可用于 NVMe SSD 和 5G 模块&#xff08;板上包含 Nano SIM 插槽…

基于.net framework4.0框架下winform项目实现寄宿式web api

首先Nuget中下载包&#xff1a;Microsoft.AspNet.WebApi.SelfHost&#xff0c;如下&#xff1a; 注意版本哦&#xff0c;最高版本只能4.0.30506能用。 1.配置路由 public static class WebApiConfig{public static void Register(this HttpSelfHostConfiguration config){// …

MDK AC5和AC6是什么?在KEIL5中添加和选择ARMCC版本

前言 看视频有UP主提到“AC5”“AC6”这样的词&#xff0c;一开始有些不理解&#xff0c;原来他说的是ARMCC版本。 keil自带的是ARMCC5&#xff0c;由于ARMCC5已经停止维护了&#xff0c;很多开发者会选择ARMCC6。 在维护公司“成年往事”项目可能就会遇到新KEIL旧版本编译器…

NSGA-II求解微电网多目标优化调度(MATLAB)

一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的&#xff0c;它比 NSGA算法更加优越&#xff1a;它采用了快速非支配排序算法&#xff0c;计算复杂度比 NSGA 大大的降低&#xff1b;采用了拥挤度和拥挤度比较算子&#xff0c;代替了需要指定的…

第十五届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组(详细分析解答)

目录 1.动态的Tab栏 1.1 题目要求 1.2 题目分析 1.3 源代码 2.地球环游 2.1 题目要求 2.2 题目分析 2.3 源代码 3.迷惑的this 3.1 题目要求 3.2 题目分析 3.3 源代码 4.魔法失灵了 4.1 题目要求 4.2 题目分析 4.3 源代码 5.燃烧你的卡路里 5.1 题目要求 5.2…

西门子(Siemens)仿真PLC启动报错处理

目录 一、背景&#xff1a; 二、卸载软件 三、安装软件 三、启动软件 四、下载PORTAL项目 五、测试 一、背景&#xff1a; 在启动S7-PLCSIM Advanced V3.0仿真PLC时报错&#xff0c;报错信息为&#xff1a;>>Siemens PLCSIM Virtual Switch<<is misconfigu…

基于C#实现Prim算法

图论在数据结构中是非常有趣而复杂的&#xff0c;作为 Web 码农的我&#xff0c;在实际开发中一直没有找到它的使用场景&#xff0c;不像树那样的频繁使用&#xff0c;不过还是准备仔细的把图论全部过一遍。 一、最小生成树 图中有一个好玩的东西叫做生成树&#xff0c;就是用…

Redis并发问题解决方案

目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候&#xff0c;虽然Redis是单线程执行指令&#xff…

基于IDEA+HTML+SpringBoot前后端分离电子商城

基于springboot的电子商城 项目介绍&#x1f481;&#x1f3fb; •B2C 商家对客户 •C2B2C 客户对商家对客户 1.1.1 B2C 平台运营方即商品的卖家 小米商城 •商品 •用户 1.1.2 C2B2C 平台运营方不卖商品&#xff08;也可以卖&#xff09; 卖家是平台的用户 买家也是平台用户 •…

【算法】经典算法题

文章目录 专题一&#xff1a;双指针1. 移动零2. 复写零3. 快乐数4. 盛最多水的容器5. 有效三角形的个数6. 查找总价格为目标值的两个商品7. 三数之和8. 四数之和 专题二&#xff1a;滑动窗口1. 长度最小的子数组2. 无重复字符的最长字串3. 最大连续1的个数 III4. 将 x 减到 0 的…

请你说一下Vue中v-if和v-for的优先级谁更高

v-if 与 v-for简介 v-ifv-forv-if & v-for使用 v-if 与 v-for优先级比较 vue2 中&#xff0c;v-for的优先级高于v-if 例子进行分析 vue3 v-if 具有比 v-for 更高的优先级 例子进行分析 总结 在vue2中&#xff0c;v-for的优先级高于v-if在vue3中&#xff0c;v-if的优先级高…

61 权限提升-RedisPostgre令牌窃取进程注入

目录 演示案例:Redis数据库权限提升-计划任务PostgreSQL数据库权限提升Windows2008&7令牌窃取提升-本地Windows2003&10进程注入提升-本地pinjector进程注入工具针对-win2008以前操作系统pexec64 32进程注入工具针对-win2008及后操作系统- (佛系) 涉及资源: postgersql是…

2023亚太杯数学建模APMCM竞赛C题思路讲解:基于ARIMA与机理模型进行预测

本文针对6大问题,从多角度分析了我国新能源电动汽车发展形势与前景。文中针对不同问题,采用了层次分析法、时间序列模型、机理模型、回归模型等数学方法。并结合实例数据,对相关模型进行求解,以量化预测了新能源电动汽车在政策驱动、市场竞争、温室气体减排等多个方面的潜在贡献…

OpenCV快速入门:图像分析——图像分割和图像修复

文章目录 前言一、图像分割1.1 漫水填充法1.1.1 漫水填充法原理1.1.2 漫水填充法实现步骤1.1.3 代码实现 1.2 分水岭法1.2.1 分水岭法原理1.2.2 分水岭法实现步骤1.2.3 代码实现 1.3 GrabCut法1.3.1 GrabCut法原理1.3.2 GrabCut法实现步骤1.3.3 代码实现 1.4 Mean-Shift法1.4.1…

【分布式】小白看Ring算法 - 03

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA开发的一种用于多GPU间…

Navicat 技术指引 | 适用于 GaussDB 的数据迁移工具

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

基于element-ui后台模板,日常唠嗑

后面会补充github地址 文章目录 目录 文章目录 案例说明 1.引入库 2.创建布局组件 3.创建布局组件 4.菜单效果展示 5.创建顶部组件 5.创建顶部面包屑组件 6.创建内容区域组件 7.效果总览 7.布丁&#xff08;实现一些小细节&#xff09; 前言一、pandas是什么&#xff1f;二、使…

Android Studio记录一个错误:Execution failed for task ‘:app:lintVitalRelease‘.

Android出现Execution failed for task :app:lintVitalRelease.> Lint found fatal errors while assembling a release target. Execution failed for task :app:lintVitalRelease解决方法 Execution failed for task ‘:app:lintVitalRelease’ build project 可以正常执…

计算机网络之网络层

一、概述 主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输 1.1网络引入的目的 从7层结构上看&#xff0c;网络层下是数据链路层 从4层结构上看&#xff0c;网络层下面是网络接口层 至少我们看到的网络层下面是以太网 以太网解决了什么问题&#xff1f; 答…

python中一个文件(A.py)怎么调用另一个文件(B.py)中定义的类AA详解和示例

本文主要讲解python文件中怎么调用另外一个py文件中定义的类&#xff0c;将通过代码和示例解读&#xff0c;帮助大家理解和使用。 目录 代码B.pyA.py 调用过程 代码 B.py 如在文件B.py,定义了类别Bottleneck&#xff0c;其包含卷积层、正则化和激活函数层&#xff0c;主要对…