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语言实现游戏👈 希望得到您的订阅和支持~ &…

三元运算符可选链操作符

三元运算符 &#xff08; ?: &#xff09;又叫条件运算符&#xff0c;接受三个运算数&#xff1a;条件 ? 条件为真时要执行的表达式 : 条件为假时要执行的表达式 <script>var a truevar b false// 单个条件a ? console.log(1) : console.log(2); // 1// 多个条件…

【SpringBoot】Spring Boot 项目中整合 MyBatis 和 PageHelper

目录 前言 步骤 1: 添加依赖 步骤 2: 配置数据源和 MyBatis 步骤 3: 配置 PageHelper 步骤 4: 使用 PageHelper 进行分页查询 总结 前言 Spring Boot 与 MyBatis 的整合是 Java 开发中常见的需求&#xff0c;特别是在使用分页插件如 PageHelper 时。Page…

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

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

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

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

【JavaScript】异步函数(async和await详解)

异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题。为此&#xff0c;ECMAScript 对函数进行了扩展&#xff0c;为其增加了两个新关键字&#xff1a;async 和 await。 1. async async 关键字用于声明异步函数。这个关键字可以用在函数声明、函数表达式、箭头…

NLP自然语言处理_序章

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

查看linux的主机配置脚本

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

esxi配置虚拟机定时开机

有个测试机器希望每晚关机&#xff0c;第2天早8点自动开机&#xff0c;linux系统中配置了定时关机任务。开机任务在esxi上配置如下 [rootlocalhost:~] cat /var/spool/cron/crontabs/root #min hour day mon dow command 1 1 * * * /sbin/tmpwatch.py 1 * *…

web server apache tomcat11-09-JNDI Datasource

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

变形记---容灾恢复(一),异常崩溃引发服务器丢档或无法正常运行

接着上篇文章 变形记---抽象接口,屎山烂代码如何改造成优质漂亮的代码 ,我一直想写一些对年轻人有帮助的文档来,刚好最近有空就零零碎碎写了一些,罗列了一些提纲然后改再删,花了一个礼拜的时间。 写这一系列的 “变形记”,也是因为最近我给M部门面试服务器主程序开发的职…

现代软件为什么要采用微服架构

现代软件采用微服务架构是为了解决传统单体架构在开发、部署和维护大型应用时面临的一系列问题。以下是采用微服务架构的主要优势&#xff1a; 1. **模块化和组件化**&#xff1a;微服务通过将应用拆分为一系列小型、松耦合的服务来提高模块化水平。每个服务都是围绕特定的业务…

RabbitMQ 各种通信模式的Python实现

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

音响扫频分析音频特性

把音响的的扬声器断开&#xff0c;接负载电阻&#xff0c;再连接到AP仪器端进行扫频测试&#xff0c;可得到频响曲线。

开源大模型 Llama 3

开源大模型Llama 3是一个在多个领域都展现出卓越性能的大模型。下面将为您介绍Llama 3的特性和一些简单的使用案例。 一、Llama 3介绍 Llama 3在Meta自制的两个24K GPU集群上进行预训练&#xff0c;使用了超过15T的公开数据&#xff0c;其中5%为非英文数据&#xff0c;涵盖30多…

刀片式服务器的作用有哪些?

刀片式服务器是是一种紧凑的独立服务器&#xff0c;将多个服务器功能集成在一个紧凑的机箱中&#xff0c;这种服务器设计可以使数据中心更加高效地管理硬件资源&#xff0c;提高服务器的可靠性和可扩展性&#xff0c;在多种场景中得到广泛的应用。 刀片式服务器的作用有哪些呢&…

WEB前端常规技术面试题之HTML+CSS基础

//每小时20道基础你知道么&#xff1f; 1.简述html、http、www、URL、web、W3C的意思 Html:超文本标记语言 http:超文本传输协议 www: 是环球信息网&#xff08;World Wide Web&#xff09;的缩写&#xff0c;也可以简称为Web&#xff0c;中文名字为“万维网”。 URL:统一…

使用yolov8 进行实例分割训练

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

【机器学习】机器学习学习笔记 - 无监督学习 - k-means/均值漂移聚类/凝聚层次聚类/近邻传播聚类 - 05

pdf在线免费转word文档 https://orcc.online/pdf 不限次数、免费不需要注册。 无监督学习 (聚类) 聚类是一种无监督学习方法&#xff0c;是将数据划分为若干个簇&#xff0c;使得簇内的点尽可能相似&#xff0c;簇间尽可能不相似。 k-means 聚类 k-means 聚类算法是一种迭…

Leetcode算法训练日记 | day30

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