DRF框架之serializer反序列化

  在本篇serializer反序列化不做赘述,前一篇序列化时已经说明了,反序列化最重要的就是数据校验,包括字段类型校验、长度、是否唯一、是否只输入、是否只输出、是否允许为空等等,也可以做自定义的校验,总之校验功能及其强大

一、序列化字段类型及参数

关于字段类型,可以查看源码

# This helps keep the separation between model fields, form fields, and
# serializer fields more explicit.
from rest_framework.fields import (  # NOQA # isort:skip
    BooleanField, CharField, ChoiceField, DateField, DateTimeField, DecimalField,
    DictField, DurationField, EmailField, Field, FileField, FilePathField, FloatField,
    HiddenField, HStoreField, IPAddressField, ImageField, IntegerField, JSONField,
    ListField, ModelField, MultipleChoiceField, NullBooleanField, ReadOnlyField,
    RegexField, SerializerMethodField, SlugField, TimeField, URLField, UUIDField,
)

字段及字段构造方式:

BooleanField:BooleanField()

CharField:CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)

ChoiceField:ChoiceField(choices) choices与Django的用法相同

DateField:DateField(format=api_settings.DATE_FORMAT, input_formats=None)

DateTimeField:DateTimeField(format=api_settings.DATE_FORMAT, input_formats=None)

DecimalField:DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)  max_digits: 最多位数  decimal_palces: 小数点位置

DictField:DictField(child=)

DurationField:DurationField()

EmailField:EmailField(max_length=None, min_length=None, allow_blank=False)

Field:Field(read_only=False, write_only=False,required=None, default=empty, initial=empty, source=None,label=None, help_text=None, style=None,error_messages=None, validators=None, allow_null=False)

FileField:FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)

FilePathField:FilePathField(path, match=None, recursive=False, allow_files=True,allow_folders=False, required=None)

FloatField:FloatField(max_value=None, min_value=None)

HiddenField:HiddenField()

IPAddressField:IPAddressField(protocol=‘both’, unpack_ipv4=False, **options)

ImageField:ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)

IntegerField:IntegerField(max_value=None, min_value=None)

ListField:ListField(child=, min_length=None, max_length=None)

MultipleChoiceField:MultipleChoiceField(choices)

NullBooleanField:NullBooleanField()

RegexField:RegexField(regex, max_length=None, min_length=None, allow_blank=False)  正则字段,验证正则模式 [a-zA-Z0-9-]+

SlugField:SlugField(maxlength=50, min_length=None, allow_blank=False) 

TimeField:TimeField(format=api_settings.TIME_FORMAT, input_formats=None)

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

UUIDField:UUIDField(format=‘hex_verbose’)  format: 1) ‘hex_verbose’ 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"   2) ‘hex’ 如 “5ce0e9a55ffa654bcee01238041fb31a”   3)‘int’ - 如: “123456789012312313134124512351145145114”   4)‘urn’ 如: “urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a”

选项参数:

max_length:最大长度:在反序列化时进行输入最大长度校验

min_lenght:最小长度:在反序列化时进行输入最小长度校验

allow_blank:是否允许为空:在反序列化时允许传空白字符串,默认不允许

trim_whitespace:是否截断左右空白字符,默认True

max_value:最大值:在反序列化时进行输入最大值校验

min_value:最小值:在反序列化时进行输入最小值校验

通用参数:

read_only:表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认False

write_only:表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认False

required:表明该字段在反序列化时必须输入,序列化时必须输出,默认True

default:反序列化时使用的默认值,如果不指明,在传递时默认值为0

allow_null:表明该字段是否允许传入null,默认False

validators:该字段使用的验证器

error_messages:包含错误编号与错误信息的字典

label:用于HTML展示API页面时,显示的字段名称,相当于模型类字段的verbose_name属性

help_text:用于HTML展示API页面时,显示的字段帮助提示信息

二、反序列化简单用法

创建序列化器对象

  • a.把前端传递的json格式参数转化为字典后,传递给data参数
  • b.调用序列化器对象.is_valid()方法,会开始进行校验,如果没有调用该方法则不校验
  • c.如果校验成功,返回True,否则返回False
  • d.必须调用is_valid()方法之后,返回了False才能调用序列化器对象.errors属性获取相应的报错信息,报错信息返回一个字典
  • e.必须调用is_valid()方法之后,返回了True才能调用序列化器对象.validated_data属性获取校验通过的信息,通过的信息返回一个字典
  • f.报错信息也可以通过给is_valid()方法将它的raise_exception属性设置为True,来主动抛出异常信息
from django.http import JsonResponse
from django.views import View
from django.db import connection
import json
from .models import Projects
from .serializers import ProjectSerializer


class ProjectsPage(View):
    '''
    类视图
    '''
    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse({"code": 1, "res": "error", "msg": serializer_check_obj.errors})

        obj = Projects.objects.create(**input_data)

        serializer_obj = ProjectSerializer(instance=obj)

        return JsonResponse(serializer_obj.data, status=201)

我们在serializer序列化器类中设置name字段值最大为2

name = serializers.CharField(max_length=2, label="项目名称", help_text='项目名称')

然后启动项目后使用postman调用该接口,验证是否进行了数据长度校验

可以看到验证成功了,但是这种异常提示都是DRF框架自己设定的,那么如果自定义异常输出信息呢?

我们可以在序列化器类对应的字段类中,设置error_messages属性,该属性的值需要传一个字典,key设定为你需要自定义异常信息的校验项,值为自定义异常信息

name = serializers.CharField(max_length=2, label="项目名称", help_text='项目名称',
                                 error_messages={"max_length": "该字段长度不能大于2"})

我们再去调一下接口,返回如下:

序列化器的重要属性

1.一定要先执行.is_valid()方法后才能访问.errors和.validated_data

2.可以不用调用.is_valid()方法就能访问.data

原文地址:https://www.cnblogs.com/xiaogongjin/p/13283611.html