序列化器的作用

就是数据和模型类对象之间的转换,数据是前段传过来的数据,转换为模型类对象之后,才可以使用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属性就行,就是属性不一样,其他的都一样。

具体源码就是:

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

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

 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字段里面有没有非法字符,这个咋实现?

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

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()方法

反序列化总结