谈谈Django REST Framework(DRF)中的序列化器
摘要
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)中的序列化器相关推荐
- DRF批量修改序列化器使用
需求:用户将选择型问答提交,前端返回所有问答数据,将问答数据批量修改入到数据库中 model class QuestionnairQA(BaseModel):question_choices = ( ...
- Django REST framework (DRF) 不能用property或method排序
因为在定义一个model的字段时,将值定义为类似下面的 code = models.CharField(choices=(("REGISTER", "注册"), ...
- django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关系
django序列化器嵌套 The Django Rest Framework (DRF) is one of the effectively written frameworks around Dja ...
- 快速上手Django(六) -Django之Django drf 序列化器Serializer类
文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...
- Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer
文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...
- 客户端序列码生成_Django REST Framework教程(2): 序列化器介绍及开发基于函数视图的API...
在上篇文章中,我们已经介绍了为什么要学习DRF,什么是序列化以及什么是符合RESTful规范的Web API.在本篇文章中我们将以博客为例,使用DRF提供的序列化器(Serializers类)开发两个 ...
- [转]Django REST framework 简介与中文教程
Django REST framework 简介与中文教程 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST AP ...
- Django框架之DRF框架
文章目录 一.前言 1.Web应用模式 2.RESTful API规范 二.简介 三.安装与配置 四.序列化器 1.创建序列化器 2.序列化操作 1)序列化过程 2)反序列化过程 3.校验规则 1)单 ...
- Django Rest Framework的使用整理
Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...
最新文章
- 世界上最长寿的泡泡:加点东西,生命延长到465天
- 索引原理,查询机制(转)
- [原创]C#应用WindowsApi实现查找(FindWindowEx)文本框(TextBox、TextEdit)。
- php mysql 源码 安装教程_源码安装和配置apache(httpd)和 PHP 和 mysql全过程(一)...
- Jquery 实现动态添加输入框编号
- 什么样的终端才是最合适桌面虚拟化的呢?
- 20200524每日一句
- 医咖会免费SPSS教程学习笔记—组内相关系数ICC
- 【软件工程】课程设计库存管理系统
- python matrix用法_详解使用python绘制混淆矩阵(confusion_matrix)
- 实验12 网络资源共享
- Qt使用Windows蓝牙API搜索蓝牙设备并建立串口服务的方法
- 微信定时发消息Python代码,简单好玩
- 【VMW】虚拟机安装小攻略
- Android UI 设计规范,Android高分面试指南
- word首页之前插入空白页没有页眉页脚且不影响后续页码
- W5100S SPI+DMA 中的片选信号处理
- 【STM32学习笔记】(9)——串口通讯(USART)详解
- 关于电脑右键缺少office三件套的解决方案
- 《图神经网络综述》Graph Neural Networks: A Review of Methods and Applications
热门文章
- 使用nslookup验证DNS的SRV记录
- 图像比对-感知哈希算法
- Mysql模拟银行数据库系统
- python程序设计基础山东联盟化工集团有限公司_智慧树app答案微信公众号,Python程序设计基础(山东联盟)知到答案...
- 基于SSM的幼儿园信息管理系统
- 【高分】ubuntu 、打开USB摄像头、Linux、USB摄像头驱动
- 计算机未来的发展的畅想英语作文,畅想关于未来的交通工具英语作文
- 联想电脑,Windows11系统,键盘突然无法输入
- Mac系统下创建右键打开Shell的功能
- 【安装官方版本】安装Office