序列化器 – Django REST框架
Django REST框架中的序列化器负责将对象转换为javascript和前端框架所能理解的数据类型。序列化器还提供了反序列化的功能,在首先验证了传入的数据后,允许将解析的数据转换回复杂的类型。REST框架中的序列化器与Django的Form和ModelForm类的工作非常相似。最常用的两个主要序列化器是ModelSerializer和HyperLinkedModelSerialzer。
这篇文章围绕着如何在Django REST框架中从头开始使用序列化器,到高级序列化器字段和参数。假设你已经熟悉了如何用Django REST框架开始一个项目?
- 创建和使用序列化器
- ModelSerializer
- HyperLinkedModelSerializer
- Serializer Fields
- 串行器字段中的核心参数
创建和使用序列化器
创建一个基本的串行器
要创建一个基本的序列化器,需要从rest_framework导入序列化器类,并为序列化器定义字段,就像在Django中创建一个表单或模型一样。
示例
# import serializer from rest_framework
from rest_framework import serializers
# create a serializer
class CommentSerializer(serializers.Serializer):
# initialize fields
email = serializers.EmailField()
content = serializers.CharField(max_length = 200)
created = serializers.DateTimeField()
这样,人们可以根据所需字段为任何特定的实体或对象声明序列化器。序列化器可用于序列化和反序列化数据。
使用序列化器对数据进行序列化
现在我们可以使用CommentSerializer来序列化一个评论,或者评论的列表。同样,使用序列化器类看起来很像使用表单类。让我们先创建一个Comment类来创建一个可以被我们的序列化器理解的Comment类型的对象。
# import datetime object
from datetime import datetime
# create a class
class Comment(object):
def __init__(self, email, content, created = None):
self.email = email
self.content = content
self.created = created or datetime.now()
# create a object
comment = Comment(email ='leila@example.com', content ='foo bar')
现在我们的对象已经准备好了,让我们试着将这个注释对象序列化。运行下面的命令。
Python manage.py shell
现在运行以下代码
# import comment serializer
>>> from apis.serializers import CommentSerializer
# import datetime for date and time
>>> from datetime import datetime
# create a object
>>> class Comment(object):
... def __init__(self, email, content, created=None):
... self.email = email
... self.content = content
... self.created = created or datetime.now()
...
# create a comment object
>>> comment = Comment(email='leila@example.com', content='foo bar')
# serialize the data
>>> serializer = CommentSerializer(comment)
# print serialized data
>>> serializer.data
现在让我们检查一下这个的输出。
要查看更多关于如何创建和使用串行器的信息,请访问 – 创建和使用串行器
ModelSerializer
ModelSerializer类提供了一个快捷方式,让你自动创建一个Serializer类,其字段与Model字段对应。
ModelSerializer类与普通的Serializer类相同,只是。
- 它将根据模型自动为你生成一组字段。
- 它将自动为序列化器生成验证器,例如唯一的验证器。
- 它包括.create()和.update()的简单默认实现。
语法 –
class SerializerName(serializers.ModelSerializer):
class Meta:
model = ModelName
fields = List of Fields
示例 –
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
默认情况下,类上的所有模型字段将被映射到相应的序列化器字段。
要检查如何在你的项目中使用ModelSerializer,请访问 – ModelSerializer in serializers – Django REST Framework 。
HyperlinkedModelSerializer
HyperlinkedModelSerializer类与ModelSerializer类类似,只是它使用超链接来表示关系,而不是主键。默认情况下,序列化器将包括一个url字段,而不是一个主键字段。url字段将使用HyperlinkedIdentityField序列化器字段来表示,模型上的任何关系将使用HyperlinkedRelatedField序列化器字段表示。
语法 –
class SerializerName(serializers.HyperlinkedModelSerializer):
class Meta:
model = ModelName
fields = List of Fields
示例 –
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
要检查如何在你的项目中使用HyperLinkedModelSerializer,请访问 – HyperlinkedModelSerializer in serializers – Django REST Framework 。
Serializer Fields
字段名称 | 描述 |
---|---|
BooleanField | 一个布尔字段,用于包装真或假的值。 |
NullBooleanField | 一个接受True、False和Null值的布尔字段。 |
CharField | CharField用于存储文本表示法。 |
EmailField | EmailField也是一个文本表示法,它验证了文本是一个有效的电子邮件地址。 |
RegexField | 顾名思义,RegexField将字符串与一个特定的重合词相匹配,否则会引发错误。 |
URLField | URLField基本上是一个RegexField,它根据一个URL匹配模式验证输入。 |
SlugField | SlugField是一个RegexField,根据模式[a-zA-Z0-9_-]+验证输入。 |
IPAddressField | IPAddressField是一个字段,确保输入是有效的IPv4或IPv6字符串。 |
IntegerField | IntegerField 基本上是一个整数字段,根据 Python 的 int 实例验证输入。 |
FloatField | FloatField 基本上是一个浮点字段,根据 Python 的浮点实例验证输入。 |
DecimalField | DecimalField 基本上是一个十进制字段,根据 Python 的十进制实例验证输入。 |
DateTimeField | DateTimeField是一个序列化字段,用于表示日期和时间。 |
DateField | DateField是一个序列化字段,用于表示日期。 |
TimeField | Timefield是一个用于表示时间的序列化字段。 |
DurationField | DurationField是一个用于表示持续时间的序列化字段。 |
ChoiceField | ChoiceField基本上是一个CharField,它根据一组有限的选择中的一个值来验证输入。 |
MultipleChoiceField | MultipleChoiceField基本上是一个CharField,它根据一组从有限的选择中选出的0、1或多个值来验证输入。 |
FileField | FileField基本上是一个文件表示。它执行Django的标准FileField验证。 |
ImageField | ImageField是一种图像表示法。它验证上传的文件内容是否符合已知的图像格式。 |
ListField | ListField 基本上是一个列表字段,根据一个对象的列表来验证输入。 |
JSONField | JSONField基本上是一个字段类,用于验证传入的数据结构是否由有效的JSON原语组成。 |
HiddenField | HiddenField是一个不根据用户输入取值的字段类,而是从默认值或可调用值取值。 |
DictField | DictField基本上是一个字典字段,它根据对象的字典来验证输入。 |
串行器字段中的核心参数
Django中的序列化字段与Django表格字段和Django模型字段相同,因此需要某些参数来操作这些字段的行为。
参数 | 说明 |
---|---|
read_only | 将此设置为True,以确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。 |
Write_only | 将此设置为True,以确保在更新或创建实例时可以使用该字段,但在序列化表示时不包括在内。 |
required | 将此设置为False也允许在序列化实例时从输出中省略对象属性或字典键。 |
default | 如果设置,这将给出默认值,如果没有提供输入值,将用于该字段。 |
allow_null | 通常情况下,如果None被传递给一个序列化器字段,将会产生一个错误。如果None被认为是一个有效的值,请将这个关键字参数设置为True。 |
source | 将被用于填充字段的属性名称。 |
validators | 一个验证器函数的列表,这些函数应该应用于输入的字段,它们要么引发一个验证错误,要么简单地返回。 |
error_messages | 一个错误代码的字典,用于错误信息。 |
label | 一个简短的文本字符串,可作为HTML表格字段或其他描述性元素中的字段名称。 |
help_text | 一个文本字符串,可作为HTML表单字段或其他描述性元素的描述。 |
initial | 一个应该用于预先填充HTML表格字段的值。 |