DRF ModelSerializer序列化类

ModelSerializer序列化类

【0】准备

  • 模型表创建
from django.db import modelsclass Book(models.Model):name = models.CharField(max_length=64, verbose_name='书名')price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='价格')publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE, verbose_name='出版社外键')authors = models.ManyToManyField(to='Author', verbose_name='作者外键')class Publish(models.Model):name = models.CharField(max_length=64, verbose_name='出版社名字')addr = models.CharField(max_length=64, verbose_name='出版社地址')class Author(models.Model):name = models.CharField(max_length=64, verbose_name='作者名字')detail = models.ForeignKey(to='AuthorDetail', on_delete=models.CASCADE, verbose_name='详情外键字段')class AuthorDetail(models.Model):phone = models.BigIntegerField(verbose_name='电话号码')age = models.IntegerField(verbose_name='年龄')

【1】ModelSerializer简介

  • 使用 ModelSerializer,你可以自动推断字段类型,并快速创建一个序列化器,该序列化器能够处理 Django 模型实例的序列化和反序列化。

  • 特点

    • 自动字段推断ModelSerializer 会自动根据 Django 模型中的字段来生成对应的序列化器字段。
    • 创建和更新模型实例:除了序列化模型数据,ModelSerializer 还可以处理创建和更新模型实例的逻辑。
    • 可定制性:虽然 ModelSerializer 提供了许多便利,但它也允许你覆盖默认行为,比如自定义字段,添加额外的验证等。

【2】Meta的参数

(1)参数介绍

  • model

    • 它接受一个Django模型类作为值,用于告诉序列化器该序列化器是基于哪个模型生成的。
  • fields

    • fields参数是一个列表或元组,用于指定序列化器应该包含模型中的哪些字段(包括自定义的字段)。
      • 默认为:fields = '__all__'即包含所有字段
  • extra_kwargs

    • extra_kwargs是一个字典,允许你为序列化器中的字段指定额外的参数。这些参数会覆盖从模型字段自动生成的序列化器字段的参数。
    • extra_kwargs的键是字段名,值是另一个字典,包含你想为该字段指定的参数。这可以用于控制字段的序列化行为,例如指定read_onlyrequiredvalidatorssource等。

(2)示例

  • 图示

image-20240415152856984

  • 代码
class BookModelSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'name', 'price', 'publish', 'authors', 'publish_name']# fields = '__all__'extra_kwargs = {'publish': {'write_only': True},'authors': {'write_only': True},}publish_name = serializers.CharField(source='publish.name', read_only=True)

【3】简单反序列化

  • 在前面学习serializers.Serializer的时候
    • 一直在强调,如果是创建新数据保存,那么就要重新create方法,如果是更新数据,那么一定要重写update方法
    • 但是在serializers.ModelSerializer我们是不用重写这两个方法的,ModelSerializer已经帮我们写好了,只要按照正常的格式输入,那么就可以了

image-20240415154416316

【4】重写反序列化保存和修改

  • 还是以作者的创建为例

  • 在模型表的修改中,作者信息保存在了两个表中

    • 一个表保存了作者的名字和详情的外键字段
    • 另一个表保存了作者的详细信息
  • 在前端传入的过程中是不可能分开传输的,即先传输名字,在传输其他信息,显示是不合理,所以这里通过一个路由接口,传递所有的信息并创建保存

  • 然而ModelSerializer的反序列化保存,需要让我们传递的是外键字段的ID,这里我们要传递的是外键的具体信息,所以这个需要我们自己重写这两个方法

  • 重写create方法

image-20240415160421663

  • 重写update方法

image-20240415161334928

  • 代码
class AuthorModelSerializer(serializers.ModelSerializer):class Meta:model = Authorfields = ['id', 'name', 'phone', 'age']phone = serializers.IntegerField(source='detail.phone')age = serializers.IntegerField(source='detail.age')def update(self, instance, validated_data):for key, value in validated_data.pop('detail').items():setattr(instance.detail, key, value)instance.detail.save()instance.name = validated_data.pop('name')instance.save()return instancedef create(self, validated_data):print(validated_data)detail_obj = AuthorDetail.objects.create(**validated_data.pop('detail'))author_obj = Author.objects.create(**validated_data, detail=detail_obj)return author_obj

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

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

相关文章

【C++打怪之路】-- C++开篇

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ &…

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别(vue-cli2 与 vue-cli3 ) 2、例子1(vue2项目) 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 (1)package.json 文件 (2)webpack.dev.conf.js文件 &#…

[大模型]Qwen-7B-hat Transformers 部署调用

Qwen-7B-hat Transformers 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下…

NLP自然语言处理_序章

开一个新篇章,立一个flag,用一段时间来学习一下NLP,涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门,此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理? NLP…

查看linux的主机配置脚本

废话不说 直接上指令 curl -Lso- bench.sh | bash 等待后,结果如图: 使用后没有问题,看情况使用 出事概不负责 介意勿用!!!

RabbitMQ 各种通信模式的Python实现

一、RabbitMQ 原理 1、基本原理 RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。支持多种客户端,如:Python、Java、Javascript、C#、C/C,Go等,支持AJ…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包,解压后即可使用 链接:https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码:c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下: ISAM.json 转 yolo.…

Leetcode算法训练日记 | day30

一、重新安排行程 1.题目 Leetcode:第 332 题 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发…

深入刨析 mysql 底层索引结构B+树

文章目录 前言一、什么是索引?二、不同索引结构对比2.1 二叉树2.2 平衡二叉树2.3 B-树2.4 B树 三、mysql 的索引3.1 聚簇索引3.2 非聚簇索引 前言 很多人看过mysql索引的介绍:hash表、B-树、B树、聚簇索引、主键索引、唯一索引、辅助索引、二级索引、联…

【Hadoop大数据技术】——Sqoop数据迁移(学习笔记)

📖 前言:在实际开发中,有时候需要将HDFS或Hive上的数据导出到传统关系型数据库中(如MySQL、Oracle等),或者将传统关系型数据库中的数据导入到HDFS或Hive上,如果通过人工手动进行数据迁移的话&am…

怎么看自己是不是公网IP?

当我们需要进行网络连接或者网络配置的时候,经常会遇到需要知道自己是否拥有公网IP的情况。公网IP是全球唯一的IP地址,在互联网上可直接访问和被访问,而私有IP则是在本地网络中使用,无法从互联网上直接访问。我们将介绍如何查看自…

笔记-----BFS宽度优先搜索

对于BFS:宽搜第一次搜到就是最小值,并且基于迭代,不会爆栈。 Flood Fill 模型 如果直译的话就是:洪水覆盖,意思就是像是从一个点一圈圈的往外扩散,如果遇见能够连通的就扩散,如果遇见无法联通的…

TCP三次握手,但通俗理解

如何用通俗的语言来解释TCP(传输控制协议)的三次握手过程? 想象一下你正在和朋友电话沟通,但你们之间不是心灵感应,而是需要通过清晰地听到对方的声音来确认通话质量良好。TCP三次握手就像是在电话拨通之前&#xff0…

爱普生发布一款16位MCU产品用于大电流LED驱动

精工爱普生发布一款内置Flash存储器的16位微控制器S1C17M13 该新品可以提供最大56mA的驱动电流用于驱动发光二极管(LED) 以往爱普生的微处理器大多继承了液晶驱动器电路,但近来随着工业自动化和家用设备使用7段LED显示的数量大幅增加,爱普生也推出了对应…

k8s:通过nodeSelector将pod调度到含有指定标签的结点上

一、查看node,并给node打标签 二、在资源清单文件中配置nodeSelector来指定要往满足哪个标签条件的结点进行调度 apiVersion: v1 kind: Pod metadata:name: probe-tcp spec:containers:- name: nginximage: nginxlivenessProbe:initialDelaySeconds: 5timeoutSeconds: 5tcpSo…

宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程

第一步:创建Django项目 使用pip install django安装创建django项目的依赖在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下: ├── app │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── url…

【海思Hi3516CV610】是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC

海思Hi3516CV610是面向新一代视频编解码标准、网络安全和隐私保护、人工智能行业应用方面的IPC SoC,除了开发普通摄像机,还可以打造极具竞争力的枪球一体机、双目长短焦摄像机产品; 处理器内核: 支持ARM Cortex-A7 MP2 时钟速率950MHz 支持…

90年代女神返港行李失踪 怒斥国泰航空

现年51岁的童爱玲在1993年拍摄电影《火蝴蝶》入行,外形出众的她当年曾与梁朝伟、黎明等男神合作,因而被封为「男神磁石」。虽然童爱玲与台湾富商王敦民结婚诞下一子后,便淡出演艺圈,但她曾在2022年复出拍摄ViuTV剧集《季前赛》&am…

探索MATLAB在计算机视觉与深度学习领域的实战应用

随着人工智能技术的快速发展,计算机视觉与深度学习已成为科技领域中最热门、最具挑战性的研究方向之一。 它们的应用范围从简单的图像处理扩展到了自动驾驶、医疗影像分析、智能监控行业等多个领域。 在这样的背景下,《MATLAB计算机视觉与深度学习实战…

3D开发工具HOOPS助力CAM软件优化制造流程

在现代制造业中,计算机辅助制造(CAM)软件的发展已成为提高生产效率和产品质量的关键。为了满足不断增长的需求和日益复杂的制造流程,CAM软件需要具备高效的CAD数据导入、云端协作、移动应用支持以及丰富的文档生成能力。 Tech So…