摘要

Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API。其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地出来复杂的数据类型,如查询集和复杂的数据结构。在本文中,我将谈谈DRF中的序列化器,以帮助您更好地理解和应用它们。

序列化器是什么?

序列化器其实可以当做一个翻译官,它能把Django的复杂语言(比如查询集和模型示例)翻译成Python的简单语言。这个过程就叫“序列化”。反过来,它也可以把Python的简单语言翻译成Django的复杂语言。这个过程就叫"反序列化“”。

序列化器的基本使用

DRF 序列化器的使用和 Django 中的 Form 非常相似。最基础的序列化器类是 Serializer。下面是一个简单的例子:

from rest_framework import serializersclass CommentSerializer(serializers.Serializer):email = serializers.EmailField()content = serializers.CharField(max_length=200)created = serializers.DateTimeField()

DRF 还提供了一个’ModelSerializer’类,是得创建序列化器变得更加简单。'ModelSericalizer’会自动为模型中的每个字段创建一个相应的序列化器字段。例如:

from rest_framework import serializers
from .models import Commentclass CommentSerializer(serializers.ModelSerializer):class Meta:model = Commentfields = ['email', 'content', 'created']

在这个例子中,我们不再需要手动定义每个字段,DRF会自动为我们处理。

验证

和Django的Form类似,DRF的序列化器也支持数据验证。在 Django REST Framework(DRF)中,你可以为序列化器的每个字段定义一个名为 validate_<field_name> 的方法,其中 <field_name> 是要验证的字段的名称。这个方法将接收一个参数,即要验证的字段的值,并且它应该返回验证后的值,或者如果验证失败,抛出一个 ValidationError 异常。一下是一个例子:

from rest_framework import serializersclass CommentSerializer(serializers.Serializer):email = serializers.EmailField()content = serializers.CharField(max_length=200)created = serializers.DateTimeField()def validate_content(self, value):if 'Ghost face' in value:raise serializers.ValidationError("These words are not allowed")return value

在这个例子中,validate_content 方法检查 content 字段的值是否包含 “Ghost face” 这个词。如果包含,就抛出一个 ValidationError 异常,否则就返回原来的值。这就是数据验证的过程。

简单来说,这段代码的作用就是对 content 字段的值进行验证,确保其不包含 “Ghost face” 这个词。如果你的数据需要满足一些特定的条件,你可以通过定义类似的方法来实现自定义的验证逻辑。

序列化

在DRF中,我们可以创建一个序列化器实例,并将需要序列化的对象传递给它,然后调用.data来获取序列化后的数据。现在让我们看一个例子:

from .models import Comment
from .serializers import CommentSerializer# 获取一个 comment 实例
comment = Comment.objects.get(id=1)# 创建序列化器实例
serializer = CommentSerializer(comment)# 获取序列化后的数据
print(serializer.data)
# 输出形如:{'email': 'abc@example.com', 'content': '整个csdn都任我闯', 'created': '2023-05-01T12:30'}

反序列化

为了做示范,这里先创建了一个序列化器实例,然后将需要反序列化的数据作为参数传给它,再通过调用 .is_valid() 方法来验证这些数据,然后数据有效,我们就可以通过. validate_data 属性来获取反序列化后的数据。

from .serializers import CommentSerializer# 定义需要反序列化的数据
data = {'email': 'abc@example.com', 'content': '整个csdn都任我闯', 'created': '2023-05-01T12:30'}# 创建序列化器实例
serializer = CommentSerializer(data=data)# 进行数据验证
if serializer.is_valid():# 获取反序列化后的数据print(serializer.validated_data)# 输出形如:{'email': 'abc@example.com', 'content': '整个csdn都任我闯', 'created': datetime.datetime(2023, 5, 1, 12, 30)}

在 Django REST Framework 序列化器的反序列化过程中,不同类型的字段会被转换成相应的 Python 数据类型。这是因为序列化器会根据字段的类型执行相应的验证和转换。在 Django REST Framework 序列化器的反序列化过程中,不同类型的字段会被转换成相应的 Python 数据类型。这是因为序列化器会根据字段的类型执行相应的验证和转换。

在我们的例子中:

email 字段是一个 EmailField,在反序列化过程中,它会确保数据是一个有效的电子邮件地址字符串。由于输入和输出都是字符串,所以它在序列化和反序列化过程中看起来没有变化。

content 字段是一个 CharField,在反序列化过程中,它会确保数据是一个字符串,并且长度不超过最大长度限制。同样的,由于输入和输出都是字符串,所以它在序列化和反序列化过程中看起来没有变化。

created 字段是一个 DateTimeField,在反序列化过程中,它会将一个符合特定格式的字符串转换为一个 datetime 对象。这就是为什么你会看到 created 字段的值从一个字符串转换为一个 datetime 对象。

总结

通过本文,我们理解了 Django REST Framework 中序列化器的核心概念和主要功能。我们了解到序列化器是一种强大的工具,可以帮助我们处理复杂的数据类型,并有效地将 Django 对象和 Python 数据类型之间进行转换。我们还探讨了序列化和反序列化的过程,包括如何使用 Serializer 和 ModelSerializer,以及如何进行数据验证。
无论是在创建 API,还是在处理复杂的数据结构时,理解和掌握序列化器都是非常重要的。希望这篇文章能帮助你更深入地理解 Django REST Framework,让你在开发过程中更得心应手。

谈谈Django REST Framework(DRF)中的序列化器相关推荐

  1. DRF批量修改序列化器使用

    需求:用户将选择型问答提交,前端返回所有问答数据,将问答数据批量修改入到数据库中 model  class QuestionnairQA(BaseModel):question_choices = ( ...

  2. Django REST framework (DRF) 不能用property或method排序

    因为在定义一个model的字段时,将值定义为类似下面的 code = models.CharField(choices=(("REGISTER", "注册"), ...

  3. django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关​​系

    django序列化器嵌套 The Django Rest Framework (DRF) is one of the effectively written frameworks around Dja ...

  4. 快速上手Django(六) -Django之Django drf 序列化器Serializer类

    文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...

  5. Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer

    文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...

  6. 客户端序列码生成_Django REST Framework教程(2): 序列化器介绍及开发基于函数视图的API...

    在上篇文章中,我们已经介绍了为什么要学习DRF,什么是序列化以及什么是符合RESTful规范的Web API.在本篇文章中我们将以博客为例,使用DRF提供的序列化器(Serializers类)开发两个 ...

  7. [转]Django REST framework 简介与中文教程

    Django REST framework 简介与中文教程 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST AP ...

  8. Django框架之DRF框架

    文章目录 一.前言 1.Web应用模式 2.RESTful API规范 二.简介 三.安装与配置 四.序列化器 1.创建序列化器 2.序列化操作 1)序列化过程 2)反序列化过程 3.校验规则 1)单 ...

  9. Django Rest Framework的使用整理

    Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...

最新文章

  1. 世界上最长寿的泡泡:加点东西,生命延长到465天
  2. 索引原理,查询机制(转)
  3. [原创]C#应用WindowsApi实现查找(FindWindowEx)文本框(TextBox、TextEdit)。
  4. php mysql 源码 安装教程_源码安装和配置apache(httpd)和 PHP 和 mysql全过程(一)...
  5. Jquery 实现动态添加输入框编号
  6. 什么样的终端才是最合适桌面虚拟化的呢?
  7. 20200524每日一句
  8. 医咖会免费SPSS教程学习笔记—组内相关系数ICC
  9. 【软件工程】课程设计库存管理系统
  10. python matrix用法_详解使用python绘制混淆矩阵(confusion_matrix)
  11. 实验12 网络资源共享
  12. Qt使用Windows蓝牙API搜索蓝牙设备并建立串口服务的方法
  13. 微信定时发消息Python代码,简单好玩
  14. 【VMW】虚拟机安装小攻略
  15. Android UI 设计规范,Android高分面试指南
  16. word首页之前插入空白页没有页眉页脚且不影响后续页码
  17. W5100S SPI+DMA 中的片选信号处理
  18. 【STM32学习笔记】(9)——串口通讯(USART)详解
  19. 关于电脑右键缺少office三件套的解决方案
  20. 《图神经网络综述》Graph Neural Networks: A Review of Methods and Applications

热门文章

  1. 使用nslookup验证DNS的SRV记录
  2. 图像比对-感知哈希算法
  3. Mysql模拟银行数据库系统
  4. python程序设计基础山东联盟化工集团有限公司_智慧树app答案微信公众号,Python程序设计基础(山东联盟)知到答案...
  5. 基于SSM的幼儿园信息管理系统
  6. 【高分】ubuntu 、打开USB摄像头、Linux、USB摄像头驱动
  7. 计算机未来的发展的畅想英语作文,畅想关于未来的交通工具英语作文
  8. 联想电脑,Windows11系统,键盘突然无法输入
  9. Mac系统下创建右键打开Shell的功能
  10. 【安装官方版本】安装Office