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

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字