drf高级二序列化器(代码片段)

author author     2023-02-15     376

关键词:

序言

序列化器是drf非常好用的一个功能!美酒虽好,切莫贪杯。合适的位置做合适的事情。drf非常擅长列表类,非图表类。此时,基础的视图是一个比较好的选择。

序列化器

序列化分为正序列化反序列化正序列化:models对象通过序列花器返回格式化的数据。反序列化:将前端提交的数据通过序列化,经过数据校验后,变成models对象保存到数据库。

REST 框架中的序列化程序的工作方式与 Django 和类非常相似。Form ModelForm Serializer响应输出ModelSerializer创建处理模型实例和查询集的序列化。

fields

序列化器和内部数据类型之间的转换(自定义序列化器和模型之间数据)。它们还处理验证输入值(数据验证)。

# 导入路径
from rest_framework.serializers import (
    Field,
    CharField
)

# Field 源码
class Field:
    _creation_counter = 0

    default_error_messages = 
        required: _(This field is required.),
        null: _(This field may not be null.)
    
    default_validators = []
    default_empty_html = empty
    initial = None

    def __init__(self, *, 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):
        self._creation_counter = Field._creation_counter
        Field._creation_counter += 1

        # If `required` is unset, then use `True` unless a default is provided.
        if required is None:
            required = default is empty and not read_only

        # Some combinations of keyword arguments do not make sense.
        assert not (read_only and write_only), NOT_READ_ONLY_WRITE_ONLY
        assert not (read_only and required), NOT_READ_ONLY_REQUIRED
        assert not (required and default is not empty), NOT_REQUIRED_DEFAULT
        assert not (read_only and self.__class__ == Field), USE_READONLYFIELD

        self.read_only = read_only
        self.write_only = write_only
        self.required = required
        self.default = default
        self.source = source
        self.initial = self.initial if (initial is empty) else initial
        self.label = label
        self.help_text = help_text
        self.style =  if style is None else style
        self.allow_null = allow_null

        if self.default_empty_html is not empty:
            if default is not empty:
                self.default_empty_html = default

        if validators is not None:
            self.validators = list(validators)

        # These are set up by `.bind()` when the field is added to a serializer.
        self.field_name = None
        self.parent = None

        # Collect default error message from self and parent classes
        messages = 
        for cls in reversed(self.__class__.__mro__):
            messages.update(getattr(cls, default_error_messages, ))
        messages.update(error_messages or )
        self.error_messages = messages

drf的fields基于继承Field参数控制序列化和反序列化验证

field通用参数

参数 默认值 描述
read_only False True该字段只在正序列化生效
write_only False True改字段只在反序列化生效
required None 如果在反序列化操作中不需要这个字段,将其设置为False。如果使用的是ModelSerializer 默认为True那么blank=Truedefault或者 null=TruerequiredFalse
default 如果设置了这个参数,提供的默认值会在这个字段没有提供输入值的时候使用。如果没有设置,默认不填充这个属性。
allow_null False 字段是否允许传入None。
source 遍历属性方法,choices参数时重写字段为CharField(source="get_字段名_display")注意:这种方式只适用序列化,反序列化会抛出异常。使用点表示法序列化字段时,如果任何对象在属性遍历期间不存在或为空,则可能需要提供一个默认值。
validators None 传入验证函数列表。要么返回None要么抛出异常被drf捕获
error_messages None 错误消息的错误代码字典。以后,异常处理时需要注意数据展示问题。
max_length

字符串类型字段

参数 默认 描述
max_length 最大长度
min_length 最小长度
allow_blank True 如果设置true,则空字符串应被视为有效值。如果设置false,则空字符串被视为无效,并将引发验证错误。
trim_whitespace True 如果设置为 ,则截断前和尾空格

数值类型字段

参数 默认 描述
max_value 验证提供的数字是否不大于此值
min_value 验证提供的数字是否不小于此值

Serializer

依据模型Product传送门

from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField(required=False)
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

Serializer更适合序列化使用

# 可以直接序列化嵌套的列表
data = [
  
    email: x@qq.com,
    content: 内容,
    created: 2023-02-14 10:10:00
  ,
  
    email: x@qq.com,
    content: 内容,
    created: 2023-02-14 10:10:00
  
]
serializer = CommentSerializer(instance=data, many=True)
# 序列化查询集
# serializer = CommentSerializer(instance=Product.objects.all(), many=True)
serializer.data()

如果想要完成反序列化那么你需要完成create和update方法。恰好ModelSerializer完成解决。

序列化器源码,如果想要序列化多条使用参数many=True

from rest_framework.fields (
    Field
)
class BaseSerializer(Field):
    def __init__(self, instance=None, data=empty, **kwargs):
        self.instance = instance
        if data is not empty:
            self.initial_data = data
        self.partial = kwargs.pop(partial, False)
        self._context = kwargs.pop(context, )
        kwargs.pop(many, None)
        super().__init__(**kwargs)

drf序列化器之请求响应以及视图(代码片段)

1.http请求处理drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作。所以在django原有的django.views.View类基础上,drf封装了多个视图子类出来提供给我们使用。DjangoRESTframwork提供的视图的主要作用:控制序列化器的... 查看详情

drf中的serialiazer序列化器(代码片段)

序列化器-Serialiazer目录序列化器-Serialiazer1序列化器的作用2序列化器使用3read_only和write_only4查询所有5新增数据6删除数据1序列化器的作用序列化,序列化器会把模型对象转化成字典,经过response以后变成字符串。反序列化,把客... 查看详情

drf之序列化组件(代码片段)

1一序列化器-Serializer作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能1.1定... 查看详情

drf之解析器组件及序列化组件(代码片段)

  通过上一篇博客的学习,我们已经有了一个共识,Django无法处理application/json协议请求的数据,即,如果用户通过application/json协议发送请求数据到达Django服务器,我们通过request.POST获取到的是一个空对象。  DjangoRestFramework... 查看详情

drf高级五modelserializer(代码片段)

...模型自动生成一组字段。它将根据模型上的参数自动生成序列化程序的验证程序。它包括create()和update()简单默认实现。fromrest_frameworkimportserializersclassProductSerializer(serializers.ModelSerializer):classMeta:model=Productfields=__all__#exclude=(created,)... 查看详情

drf框架serializer之modelserializer(代码片段)

一、基本语法在没有使用ModelSerializer序列化器类之前,我们定义的序列化器类都需要添加对应模型类字段的很多字段,如果添加的字段特别多,那么势必会影响开发效率和代码的可读性,因此会选择一种更为简洁的序列化器类来... 查看详情

drf-解析器组件(代码片段)

...到原始的客户端请求的字节数据,经过decode,然后json反序列化之后,也可以得到一个Python字典类型的数据。但是,这种方式并不被推荐,因为已经有了非常优秀的第三方工具,那就是DjangoRest 查看详情

09.drf-modelserializer(代码片段)

四、模型类序列化器ModelSerializer如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动... 查看详情

16-drf工程搭建与序列化器(代码片段)

...amework‘,]使用DjangoRESTframework快速实现图书的RESTAPI2、创建序列化器1、在Book应用下新建serializers.py用于保存该应用的序列化器,创建一个BookInfoSerializer用于序列化与反序列化。fromrest_frameworkimportserializersfromBook.modulesimportBookInfoclassB... 查看详情

drf序列化器的实例(代码片段)

...ngo.httpimportJsonResponse,QueryDictfrombookset.modelsimportBookInfo#导入序列化列from.serializersimportBookInfoSerializer##########################################################################################序列化##########################################classBookInfoView(View):defget(s... 查看详情

二:drf视图(代码片段)

 DjangoRESTframwork提供的视图的主要作用:控制序列化器的执行(检验、保存、转换数据)控制数据库查询的执行一:请求与响应1:requestRequest1RESTframework传入视图的request对象不再是Django默认的HttpRequest对象,而是RESTframework提供的... 查看详情

drf序列化(代码片段)

一、安装Django RESTframework框架使用命令:pipinstalldjangorestframework二、在setings里面注册INSTALLED_APPS=["rest_framework"]Serializers序列化组件 查看详情

drf中的序列化器详细应用(代码片段)

...前端是GET请求,则构造查询集,将结果返回,这个过程为序列化;如果前端是POST请求,假如要对数据库进行改动,则需要拿到前端发来的数据,进行校验,将数据写入数据库,这个过程称为反序列化)最原始的视图可以实现这... 查看详情

drf框架之serializer序列化器的序列化操作(代码片段)

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.今天,我们就先来学习一下Serializer序列化器。使用Serializer序列化器的开发步骤:1.定义Serializer序列化器首先,我们要在子应用中,创建见一个serializers.py文件... 查看详情

drf框架之modelserializer序列化器(代码片段)

ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators,比如unique_together包含默认的create()和update()的... 查看详情

restframework(drf)框架初探以及认识serializers序列化器的增删改查(代码片段)

定义DjangoRESTframework(简称DRF)是一个强大灵活的wbapi工具功能完善,可快速开发api平台官网地址https://www.django-rest-framework.org/安装要求pip3installdjango==3.2pip3installdjangorestframework1.0使用drf实现用户的增删改查1.创建app2.定义数 查看详情

drf序列化器serializers.serializermethodfield()的用法(代码片段)

...是不带域名的呢?解析:带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候会检查上下文有没有request,如果有,就给图片加上域名,比如说我们视图用的是apiview():我们需要序列化数据的时候,加  context="... 查看详情

08.drf-反序列化(代码片段)

三、反序列化使用3.1验证使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。验... 查看详情