DRF ModelSerializer序列化类

2024-04-20 15:12

本文主要是介绍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

这篇关于DRF ModelSerializer序列化类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920593

相关文章

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

jquery 表单序列化

jQuery序列化表单的方法总结 现在这里贴出案例中静态的html网页内容: <!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><title>Title</title><script src="../js/jquery-3.2.1.js"></script></head><body><form method="post"

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1)getTransletInstance2)defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码,但由于defineClas

Spring之——整合Redis序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer

当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。 Spring Data JPA为我们提供了下面的Serializ

使用 `readResolve` 防止序列化破坏单例模式

单例模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在 Java 中,我们常常通过私有化构造方法和提供静态访问方法来实现单例。然而,尽管这些手段可以有效防止类的实例化,反射和序列化依然能够破坏单例模式的唯一性。本文将重点讲解序列化如何破坏单例模式,以及如何通过 readResolve 方法来防止这种破坏。 1. 序列化和反序列化 序列化 是指将对象的状态转换为字节

他来了他来了,Hadoop序列化和切片机制了解一下?

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 切片机制 一个超大文件在HDFS上存储时,是以多个Block存储在不同的节点上,比如一个512M的文件,HDFS默认一个Block为128M,那么1G的文件分成4个Block存储在集群中4个节点上。 Hadoop在map阶段处理上述512M的大文件时分成几个MapTask进行处理呢?Hadoop的MapTask并行度与数据切片有有关系

【Linux】自定义协议与序列化和反序列化

一、自定义协议 1.1 自定义报文格式        在前面的博客中,我们可以知道在TCP协议中,面向的是字节流;而UDP协议中面向的是数据报。因此,在手写简单的TCP和UDP服务器中,所使用的是接收函数和发送函数不同。因此,在TCP协议中,我们需要分清楚一个完整的报文,并将其分离出来,因此,我们应该如何进行分离出一个完整的报文呢??        如果一个报文中什么标志也没有,那么必然是不

java 中rmi 服务的搭建与测试,java rmi 其实是加载远程的序列化后的java对象到本地 进行执行,所以注意rmi的远程代码执行漏洞。

经测试,在客户端调用服务端的方法时,也会会打印HelloServiceImpl中的 System.out.println的内容,所以可以证明会加载远程的HelloServiceImpl类在本地执行!!! rmi 客户端与服务端之间 传输的是序列化后的类示例对象,然后在客户端在反序列化生成对象,并初始化调用构造方法。 ldap 协议也会造成本地执行远程class文件的问题,不通与rmi,ldap

Redis对象读写序列化

 在使用Redis中,将对象序列化以Json方式写入Redis的方法: 基本推荐使用JdkSerializationRedisSerializer和StringRedisSerializer,因为其他两个序列化策略使用起来配置很麻烦,如果实在有需要序列化成Json和XML格式,可以使用java代码将String转化成相应的Json和XML。 1:使用Spring-data-Re

json序列化 (gob标准库)

json序列化 (gob标准库) type s struct {data map[string]interface{}} 1.json序列化 会将 int 类型,转化成float64。 func jsonDemo() {var s1 = s{data: make(map[string]interface{}, 8),}s1.data["count"] = 1ret, err := jso