序列化的概念
序列化是指将对象转换为字节序列的过程,而反序列化则是将字节序列解析成相应的对象。对于Web开发来说,序列化最常见的应用场景是将Python对象转化成JSON格式的数据用于前端渲染。而在Django框架中,有一套封装好的序列化工具——Django Rest Framework(DRF),它让我们能够以快捷的方式实现序列化和反序列化的过程,且支持多种输出格式和对数据的过滤、校验和限制等功能。
DRF序列化组件
DRF提供了两个重要的组件: Serializer 和 ModelSerializer。
Serializer
该组件是DRF的核心部分, 它将Python原生数据类型到能够被渲染到JSON格式所需的数据类型之间进行转换。能实现的序列化过程将Python的数据类型(一般是一个模型对象)转换成Python原生数据类型,最终将其转换成JSON格式,以便于输出。
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
field1 = serializers.CharField(max_length=10)
field2 = serializers.DecimalField(max_digits=3, decimal_places=1)
field3 = serializers.IntegerField()
例子中,我们定义了一个ExampleSerializer
的类,继承了 serializers.Serializer
。接着定义了三个field
,分别对应 Python 数据类型中的字符串、小数和整数类型。然后我们可以把其转换成JSON格式。
serializer_instance = ExampleSerializer({
'field1': 'A string',
'field2': 199.9,
'field3': 543,
})
print(serializer_instance.data)
运行结果为:
{
'field1': 'A string',
'field2': '199.9',
'field3': 543
}
ModelSerializer
该组件继承自Serializer
,主要作用是快速实现对数据库模型的序列化或反序列化。我们首先需要创建模型类,然后使用DRF的 ModelSerializer
继承该模型类,如下所示:
from rest_framework import serializers
from myapp.models import ExampleModel
class ExampleModelSerializer(serializers.ModelSerializer):
class Meta:
model = ExampleModel
fields = '__all__'
在Meta
中定义了模型类 (model
) 和序列化的字段 (fields
)
DRF序列化过程
一个 DRF 序列化的过程主要包括以下四个步骤:
定义serializer类
我们可以在程序的某个地方定义一个serializer类。先用Python定义这个类,然后用DRF序列化器完成将该类转换为JSON格式。
使用serializer实例化
DRF序列化过程需要将用户输入的 JSON 格式字符串转换成Python字典,然后使用我们定义的serializer完成转换,将Python对象(包括模型对象)输出至 JSON 。在第二步的过程中,输入的 JSON 字符串被序列化器解析成Python对象:
serializer = ExampleSerializer(data=data_dict)
if serializer.is_valid():
print(serializer.validated_data)
校验数据并返回对象
序列化器也可以用来校验我们输入的数据,这个输入值可以是从一个POST请求中收到的数据,也可以通过一个 AJAX 请求提交而来。在 DRF 框架中使用校验器进行个性化的校验处理支持的数据格式包括JSON、表单、文本等。在这一步中,我们定义的serializer将完成数据的合法性校验以及将校验过的 validated_data
的对象返回回去。
转换成JSON响应
将数据对象转化为序列化的JSON格式,在HTTP Response中返回。在DRF中,可以使用自带的Response
类来完成响应结果的封装操作。
小结
DRF序列化器是一个非常强大的工具,可以让我们的开发工作变得快捷和准确。它可以用来序列化和反序列化Python对象,对数据进行校验和过滤,并且支持多种输出格式。通过这篇文章,大家应该对DRF序列化器的概念、组件和序列化过程有了更深入的了解。