前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DRF框架(四)——序列化器和反序列化器

DRF框架(四)——序列化器和反序列化器

作者头像
一写代码就开心
发布2021-03-02 14:41:31
9440
发布2021-03-02 14:41:31
举报
文章被收录于专栏:java和pythonjava和python

目录

  • 序列化器的作用
  • rest框架给提供的序列化器
  • 序列化文件的写法
  • 序列化的使用
    • 关联数据的序列化咋实现
  • 序列化总结
  • 反序列化
    • 反序列化view里面的格式
    • 追加校验逻辑
    • 反序列化后新增或者更新咋实现
  • 反序列化总结

序列化器的作用

就是数据和模型类对象之间的转换,数据是前段传过来的数据,转换为模型类对象之后,才可以使用rest框架保存到数据库。将数据查询出来是模型类对象,只有转化为一定的格式,比如json格式之后,才可以返回给前段。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总之: 这个序列化器就是一个中转站 主要进行对数据的转换,和对数据的校验(比如,前段传过来的数据格式正确之后,才可以保存到数据库)

rest框架给提供的序列化器

提供了两个,一个是基类Serializer,一个是我们常用的 ModelSerializer。ModelSerializer序列化器就是在Serializer上面封装了一个,总之,以后使用ModelSerializer就可以了。

ModelSerializer与常规的Serializer相同,但提供了:

1.基于模型类自动生成一系列字段

2.包含默认的create()和update()的实现

3.基于模型类自动为Serializer生成validators,比如unique_together

序列化文件的写法

我们创建一个序列化的文件,如下:

在这里插入图片描述
在这里插入图片描述

文件里面就开始写类了,如果类继承的是Serializer,也就是继承了基类,那么这个我们要写的类的写法就是和model里面差不多,,格式如下:

在这里插入图片描述
在这里插入图片描述

序列化器中的字段不一定和model里面的字段个数一样,可多可少。返回多少字段是根据序列化器中的规定的。

如果是继承了ModelSerializer,写法就变为:

在这里插入图片描述
在这里插入图片描述

序列化的使用

在view里面写逻辑的时候,比如我们将查询出来的数据,要返回给前段,那么就需要序列化查询出来的数据,那么就需要使用序列化器,使用方法如下:

在这里插入图片描述
在这里插入图片描述

如果前端传过来数据,我要进行反序列化咋办,将instace 这个属性变为data属性就行,就是属性不一样,其他的都一样。

具体源码就是:

在这里插入图片描述
在这里插入图片描述

使用方法可以有以下的总结:

在这里插入图片描述
在这里插入图片描述

将查询出来的数据返回给前段,有可能查询出多条数据,咋返回了:

代码语言:javascript
复制
 book_data = serializers.BookModelSerializers(book_obj).data  #单条数据序列化 

book_data = serializers.BookModelSerializers(book_query,many=True).data  
#不管是一条还是多条,只要数据是被[]嵌套,都要写many=True

关联数据的序列化咋实现

举个例子,一本书的model,书详情的model。我们就需要在详情model里面有一个外键,关联书的model,如果序列化器继承的是Serializer,那么在序列化的文件中的写法就是:

在这里插入图片描述
在这里插入图片描述

序列化总结

在这里插入图片描述
在这里插入图片描述

反序列化

在这里插入图片描述
在这里插入图片描述

反序列化的序列化对象里面有以下的属性

在这里插入图片描述
在这里插入图片描述

校验是要校验什么?

1 前端传过来的类型对不对 2 长度对不对,是不是必传

反序列化view里面的格式

在这里插入图片描述
在这里插入图片描述

追加校验逻辑

反序列化首先要对前端传过来的数据进行校验,但是rest框架给的校验的属性不够咋办,我们自己定义校验的逻辑,比如,我们要校验前端传到后端的name字段里面有没有非法字符,这个咋实现?

序列化文件里面的对应类里面多加一些方法,比如:

代码语言:javascript
复制
class BookModelDeserializer(ModelSerializer):  
#一些只参与反序列化的字段,但是不是与数据库关联的,自定义不入库的反序列化的字段
#   re_name = seializers.CharField(write_only=True)
    class Meta:
        model = models.Book
        fields = ('name', 'price', 'publish', 'authors')  #没有默认值的字段必须序列化,为其传值
        # extra_kwargs 用来完成反序列化字段的 系统校验规则
        extra_kwargs = {
            'name': {
                'required': True,  #设置name字段必填
                'min_length': 1,
                'error_messages': {
                    'required': '必填项',
                    'min_length': '太短',
                }
            }
        }
    



#  以下就是自定义的校验规则



    # 局部钩子校验单个字段  validate_字段名
    def validate_name(self, value):  #value是字段name的值
        # 书名不能包含 g 字符
        if 'g' in value.lower():
            raise ValidationError('该g书不能出版')
        return value
    # 全局钩子  (对多个字段进行一起校验)
    def validate(self, attrs):
        publish = attrs.get('publish')   #publish如果是外键字段,这个就是publish对象
        name = attrs.get('name')
        if models.Book.objects.filter(name=name, publish=publish):
            raise ValidationError({'book': '该书已存在'})
        return attrs

    # 注意:ModelSerializer类已经帮我们实现了 create 与 update 方法,不需要写create就能创建

反序列化后新增或者更新咋实现

在view里面

在这里插入图片描述
在这里插入图片描述

如果序列化文件里面的类继承的是Serializer,那么还必须要重写create() 和 update()方法

在这里插入图片描述
在这里插入图片描述

反序列化总结

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 序列化器的作用
  • rest框架给提供的序列化器
  • 序列化文件的写法
  • 序列化的使用
    • 关联数据的序列化咋实现
    • 序列化总结
    • 反序列化
      • 反序列化view里面的格式
        • 追加校验逻辑
          • 反序列化后新增或者更新咋实现
          • 反序列化总结
          相关产品与服务
          文件存储
          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档