Rest Framework 序列化器(serializer)

什么是序列化器

	序列化器允许把像查询集和模型实例这样的复杂数据转换为可以轻松渲染成JSON,XML或其他内容类型的原生Python类型。序列化器还提供反序列化,在验证传入的数据之后允许解析数据转换回复杂类型。

REST framework中的serializers与Django的Form和ModelForm类非常像。我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出,以及一个ModelSerializer类,它为创建用于处理模型实例和查询集的序列化程序提供了有用的快捷实现方式。

声明序列化器(serializer)

我们声明一个序列化器(serializer),我们可以使用它来序列化和反序列化
声明一个序列化器看起来非常像声明一个form

Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
例如,我们已有了一个数据库模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name=‘名称’)
bpub_date = models.DateField(verbose_name=‘发布日期’, null=True)
bread = models.IntegerField(default=0, verbose_name=‘阅读量’)
bcomment = models.IntegerField(default=0, verbose_name=‘评论量’)
image = models.ImageField(upload_to=‘booktest’, verbose_name=‘图片’, null=True)
我们想为这个模型类提供一个序列化器,可以定义如下:
class BookInfoSerializer(serializers.Serializer):
“”“图书数据序列化器”""
id = serializers.IntegerField(label=‘ID’, read_only=True)
btitle = serializers.CharField(label=‘名称’, max_length=20)
bpub_date = serializers.DateField(label=‘发布日期’, required=False)
bread = serializers.IntegerField(label=‘阅读量’, required=False)
bcomment_count = serializers.IntegerField(label=‘评论量’, required=False)
image = serializers.ImageField(label=‘图片’, required=False)

注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

参数:

max_length

最大长度

min_lenght

最小长度

allow_blank

是否允许为空

trim_whitespace

是否截断空白字符

max_value

最小值

min_value

最大值

read_only

将其设置True为确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。,默认False

write_only

将其设置True为确保在更新或创建实例时可以使用该字段,但在序列化表示时不包括该字段。,默认False

required

  通常,如果在反序列化期间未提供字段,则会引发错误。如果在反序列化期间不需要此字段,则设置为false。

将此设置为False还允许在序列化实例时从输出中省略对象属性或字典键。如果密钥不存在,它将不会包含在输出表示中,默认True

default

如果设置,则给出默认值,如果未提供输入值,将使用该字段。如果未设置,则默认行为是根本不填充该属性。

该default过程中部分更新操作不适用。在部分更新的情况下,只有传入数据中提供的字段将返回一个验证值。

可以设置为函数或其他可调用函数,在这种情况下,将在每次使用时评估该值。调用时,它不会收到任何参数。如果callable有一个set_context方法,那么每次在获取值之前都会调用该方法,并将字段实例作为唯一参数。这与验证器的工作方式相同。

请注意,设置default值意味着不需要该字段。包含default和required关键字参数都是无效的,并且会引发错误。

allow_null

通常,如果None传递给序列化程序字段,则会引发错误。将此关键字参数设置为Trueif None应被视为有效值。,默认False

validators

应该应用于传入字段输入的验证程序函数列表,它会引发验证错误或只是返回。验证器函数通常应该提高serializers.ValidationError,但是Django的内置函数ValidationError也支持与Django代码库或第三方Django软件包中定义的验证器兼容。

source

将用于填充字段的属性的名称。可能是一个只接受self参数的方法,例如URLField(source=‘get_absolute_url’),或者可以使用点分表示来遍历属性,例如EmailField(source=‘user.email’)。

该值source=’*'具有特殊含义,用于指示整个对象应该传递到该字段。这对于创建嵌套表示或者需要访问整个对象以确定输出表示的字段非常有用。

默认为字段的名称。

error_messages

错误消息的错误代码字典。

label

一个简短的文本字符串,可用作HTML表单字段或其他描述性元素中字段的名称。

help_text

一个文本字符串,可用作HTML表单字段或其他描述性元素中字段的描述。

initial

应该用于预先填充HTML表单字段值的值。你可以将一个callable传递给它,就像你对任何常规Django一样Field
例如:
import datetime
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
day = serializers.DateField(initial=datetime.date.today)

style

键值对的字典,可用于控制渲染器应如何渲染字段。
例如:
password = serializers.CharField(
style={‘input_type’: ‘password’}
)

	Use a radio input instead of a select input.
	
	color_channel = serializers.ChoiceField(
	    choices=['red', 'green', 'blue'],
	    style={'base_template': 'radio.html'}
	)

常用字段

BooleanField

布尔

使用HTML编码表单输入时,请注意省略值将始终被视为将字段设置为False,即使它已default=True指定选项。这是因为HTML复选框输入通过省略值来表示未检查状态,因此REST框架将省略视为空复选框输入。

CharField

字符串字段
文本表示。(可选)验证文本是否短于max_length和长于min_length。

EmailField

文本表示,将文本验证为有效的电子邮件地址。

RegexField

验证给定值的文本表示与某个正则表达式匹配。

对应于django.forms.fields.RegexField。

RegexField(regex, max_length=None, min_length=None, allow_blank=False)

强制regex参数可以是字符串,也可以是编译的python正则表达式对象。

URLField

A RegexField根据URL匹配模式验证输入。预计表单的完全限定URL

URLField(max_length=200, min_length=None, allow_blank=False)

IntegerField

整数表示。

IntegerField(max_value=None, min_value=None)

max_value 验证提供的数字是否不大于此值。
min_value 验证提供的数字是否不低于此值。

~~

FloatField

浮点表示
FloatField(max_value=None, min_value=None)

max_value 验证提供的数字是否不大于此值。
min_value 验证提供的数字是否不低于此值。

DecimalField

一个十进制表示

DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)

max_digits数字中允许的最大位数。它必须是None或大于或等于的整数decimal_places。
decimal_places 与数字一起存储的小数位数。
coerce_to_string设置为True是否应为表示返回字符串值,或者False是否Decimal应返回对象。默认值与COERCE_DECIMAL_TO_STRING设置键的值相同,True除非被覆盖。如果Decimal序列化程序返回了对象,则最终输出格式将由渲染器确定。请注意,设置localize将强制该值True。
max_value 验证提供的数字是否不大于此值。
min_value 验证提供的数字是否不低于此值。
localize设置为True根据当前区域设置启用输入和输出的本地化。这也将迫使coerce_to_string到True。默认为False。请注意,如果已USE_L10N=True在设置文件中进行了设置,则会启用数据格式设置。

DateTimeField字段

日期和时间表示

DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)

format - 表示输出格式的字符串。如果未指定,则默认为与DATETIME_FORMAT设置键相同的值,'iso-8601’除非设置,否则将设置该值。设置为格式字符串表示to_representation应将返回值强制转换为字符串输出。格式字符串如下所述。设置此值以None指示datetime应返回Python 对象to_representation。在这种情况下,日期时间编码将由渲染器确定。
input_formats - 表示可用于解析日期的输入格式的字符串列表。如果未指定,DATETIME_INPUT_FORMATS将使用默认设置[‘iso-8601’]。

ChoiceField

可以接受有限选择集中的值的字段。

ModelSerializer如果相应的模型字段包含choices=…参数,则用于自动生成字段。
gender = models.CharField(choices=((‘0’,‘man’),(‘1’,‘women’)),max_length=1)

FileField

文件表示。执行Django的标准FileField验证。
FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
max_length - 指定文件名的最大长度
allow_empty_file - 指定是否允许空文件。
use_url- 如果设置为,True则URL字符串值将用于输出表示。如果设置为False则文件名字符串值将用于输出表示。默认为UPLOADED_FILES_USE_URL设置键的值,True除非另有设置。

ImageField

图像表示。将上载的文件内容验证为与已知图像格式匹配。
ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
max_length - 指定文件名的最大长度。
allow_empty_file - 指定是否允许空文件。
use_url- 如果设置为,True则URL字符串值将用于输出表示。如果设置为False则文件名字符串值将用于输出表示。默认为UPLOADED_FILES_USE_URL设置键的值,True除非另有设置。
需要Pillow包装或PIL包装。Pillow建议使用该包,因为PIL不再主动维护

创建Serializer对象

定义好Serializer类后,就可以创建Serializer对象了。
Serializer的构造方法为:
Serializer(instance=None, data=empty, **kwarg)
说明:
用于序列化时,将模型类对象传入instance参数
用于反序列化时,将要被反序列化的数据传入data参数
除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = AccountSerializer(account, context={‘request’: request})
通过context参数附加的数据,可以通过Serializer对象的context属性获取。

序列化
模型类对象 —> python字典 用于输出 返回给前端时使用
class BookInfoForFrontendSerializer(serializers.Serializer):
“”“图书数据序列化器”""
id = serializers.IntegerField(label=‘ID’, read_only=True)
btitle = serializers.CharField(label=‘名称’, max_length=20)
bpub_date = serializers.DateField(label=‘发布日期’, required=False)
bread = serializers.IntegerField(label=‘阅读量’, required=False)
bcomment_count = serializers.IntegerField(label=‘评论量’, required=False)
image = serializers.ImageField(label=‘图片’, required=False)
反序列化
前端产送的数据 —> 经过验证 —> python字典 -> save -> 模型类对象 用于输入 接收前端数据时使用
class BookInfoSaveSerializer(serializers.Serializer):
“”“图书数据序列化器”""
btitle = serializers.CharField(label=‘名称’, max_length=20, write_only=True)
bpub_date = serializers.DateField(label=‘发布日期’, required=False)
bread = serializers.IntegerField(label=‘阅读量’, required=False)
bcomment_count = serializers.IntegerField(label=‘评论量’, required=False)
image = serializers.ImageField(label=‘图片’, required=False)

read_only = True 只在序列化时使用
write_only = True 只在反序列化时使用

参考官方文档 https://q1mi.github.io/Django-REST-framework-documentation/api-guide/serializers_zh/#_2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章