Django DRF序列化器serializer

news2024/9/23 15:32:49

以下案例由浅到深,逐步深入,通过实例介绍了序列化器的使用方法,和遇到的常见问题的解决方法。

一、序列化器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、返回数据展示 

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

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

相关文章

找论文找论文

这里写目录标题 找到的&#xff0c;待筛选识别检测 OCR综述&#xff0c;经典论文综述OCR识别OCR检测端到端文本识别问题集怎么看一篇论文有没有代码怎么直接找比如某一年的CVPR关于OCR方面的最新论文拿到一篇论文&#xff0c;根据论文名字怎么检索到期刊和发表日期 功能技巧找顶…

geoserver发布tif矢量数据图层

cesium加载上传至geoserver的tif矢量数据_cesium加载tiff-CSDN博客 geoserver安装及跨域问题解决方案&#xff1a;geoserver安装及跨域问题解决方案_geoserver 跨域_1 1王的博客-CSDN博客 将TIF上传至geoserver 启动geoserver服务&#xff0c;并进入geoserver主页。 1. 新建…

内建组件和模块

讨论 Vue.js 中几个非常重要的内建组件和模块&#xff0c;例如 KeepAlive 组件、Teleport 组件、Transition 组件等&#xff0c;它们都需要渲染器级别的底层支持。另外&#xff0c;这些内建组件所带来的能力&#xff0c;对开发者而言非常重要且实用&#xff0c;理解它们的工作原…

windows版本的grafana如何离线安装插件

本文以安装clickhouse的插件为例&#xff0c;记录下如何离线安装插件 1 下载插件 ClickHouse plugin for Grafana | Grafana Labs 2 找到grafana的配置文件 打开编辑&#xff0c;搜索plugin关键字&#xff0c;修改plugin的加载目录 目录不存在&#xff0c;手动创建&#xff0…

TableStructureRec: 表格结构识别推理库来了

目录 引言lineless_table_rec: 无线表格识别库安装使用结果 wired_table_rec&#xff1a;有线表格识别库安装使用结果 写在最后 引言 TableStructureRec 仓库是用来对文档中表格做结构化识别的推理库&#xff0c;包括来自 PaddleOCR 的表格结构识别算法模型、来自阿里读光有线…

创建maven的web项目

&#xff08;一&#xff09;创建maven的web项目 Step1、创建一个普通的maven项目 &#xff08;1&#xff09;新建一个empty project&#xff0c;命名为SSM2。 点击项目名&#xff0c;右键new&#xff0c;选择Module&#xff0c;左侧选择“Maven archetype”&#xff0c;可以给…

gmapping仿真

文章目录 获取源码安装依赖项编译简单场景运行gmapping开启键盘控制通过launch文件来启动gmappingGmapping建图的参数设置地图的保存和加载参考 获取源码 cd ~/catkin_ws/src/ git clone https://gitcode.com/weixin_42990464/wpr_simulation.git git clone https://gitcode.c…

Action!录屏工具免费完整版,录屏软件,打开即可解锁最新完整可用版本,支持GPU加速HDR视频录制和播放

一、软件简介 本次带来的录屏工具已升级为【完整版本】&#xff0c;所有功能全部可用。该录屏工具支持GPU硬件加速&#xff0c;可以智能识别主流硬件设备&#xff0c;支持通过GPU进行HDR视频录制和播放进行。视频录制帧率最高支持360FPS&#xff0c;直播视频帧率最高支持60FPS…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法&#xff1a; String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法&#xff1a; static Thread currentThread() 让线程睡眠的成员方法&#xff1…

穿山甲SDK 集成·android接入广告·app流量变现

接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 随着移动互联网的快速发展&#xff0c;广告成为了许多应用开发者获取收益的主要方…

java--static的应用知识:单例设计模式

1.什么是设计模式(Design pattern) ①一个问题通常有n中解法&#xff0c;其中肯定有一种解法最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 ②设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题。 2.单例设计模式 确保一个类只…

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解

01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”&#xff0c;不如说是在讲Pthon的“日志功能-日志模块-日志输出”&#xff0c;即Python的logging模块。 下面用一个实例来进行讲解。 …

PubLayNet:电子文档元素识别的有史以来最大数据集

文章目录 摘要引言相关工作文档布局的自动标注布局类别标注算法PMCOA XML预处理和解析PMCOA PDF解析字符串预处理PDF-XML匹配算法生成实例分割质量控制 数据划分 结果基于深度学习的文档分布识别表格检测微调用于不同的领域 讨论结论附录论文中的一些英文单词论文中的其他一些专…

微信小程序汽车租赁系统

微信小程序汽车租赁系统 本系统包含了3类用户&#xff0c;分别为客户、员工以及管理员&#xff0c;客户主要是满足自身的租车需求&#xff0c;员工主要负责车辆的调度问题和维修状况&#xff0c;管理员则是主要对人员、车辆和订单的管理。以下是对各自功能的详细介绍: 客户可…

MySQL的Redo Log跟Binlog

文章目录 概要Redo Log日志Redo Log的作用Redo Log的写入机制 Binlog日志Binlog的作用Binlog写入机制 两段提交 概要 Redo Log和Binlog是MySQL日志系统中非常重要的两种机制&#xff0c;也有很多相似之处&#xff0c;本文主要介绍两者细节和区别。 Redo Log日志 Redo Log的作…

ELK企业级日志分析平台——logstash

部署 新建一台虚拟机elk4部署logstash [rootelk4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm[rootelk4 ~]# yum install -y logstash-7.6.1.rpm 命令方式 [rootelk4 bin]# /usr/share/logstash/bin/logstash -e input { stdin { } } output { stdout {} } elasticsearc…

vivado产生报告阅读分析17-时序报告13

CDC 拓扑结构的简化板级原理图 以下部分展示了 CDC 拓扑结构的简化板级原理图以及简要说明。在所有板级原理图中 &#xff0c; 源时钟信号线 &#xff08; 通常为 clk_a&#xff09; 以蓝色高亮 &#xff0c; 目标时钟信号线 &#xff08; 通常为 clk_b &#xff09; 以橙色…

深度强化学习中的动作屏蔽(Action Masking)

RLlib中的example有一个代码是action_masking&#xff0c;很感兴趣&#xff0c;所以学习了一下 主要功能是&#xff1a; “动作屏蔽”允许代理根据当前观察选择动作。这在许多实际场景中非常有用&#xff0c;在这些场景中&#xff0c;不同的时间步长可以执行不同的操作。解释动…

解决:Gitee + PicGo配置图床失败

解决&#xff1a;Gitee PicGo配置图床失败 PicGo安装插件的时候选择&#xff1a;gitee-uploader&#xff0c;不要选择gitee&#xff01; 在Gitee新建的图床仓库中设置一个images文件夹&#xff0c;用来保存上传的图片&#xff0c;但是要注意在PicGo中的path中要写上路径/img…

视频直播美颜SDK全面解析:美颜SDK技术对比

美颜SDK的出现&#xff0c;为直播主和用户提供了更丰富的美颜体验。 一、美颜SDK的基本原理 美颜SDK多种技术协同工作&#xff0c;使得直播画面更加细腻、自然&#xff0c;给用户带来更好的视觉感受。不同的SDK可能采用不同的算法和处理流程&#xff0c;从而产生各具特色的美…