反序列化之Serializers,ModelSerializers

Posted zhengyuli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反序列化之Serializers,ModelSerializers相关的知识,希望对你有一定的参考价值。

 Sourse

可以指定字段(name   publish.name),可以指定方法

技术图片

但是不能name和source指定的name不能重名

技术图片

还可以用source出版社地址,

技术图片

还可以指定一个方法

技术图片

技术图片

技术图片

如果需要拿中文

get_字段名_display

models.py定义一个字段

 xx=models.IntegerField(choices=((0,文学类),(1,情感类)),default=1,null=True)

技术图片

rest-framework序列化之Serializer

这里要穿两个参数

技术图片

返回作者信息

技术图片

还可以再用个序列化的类

技术图片

技术图片

返回结果都是一样的

write_only

write_only序列化的时候,该字段不显示,后端序列化到前端不显示

read_only

反序列化的时候,该字段不传,就是前段传给后端可以不传

把数据反序列化保存起来

技术图片

instance是序列化的对象,data是反序列化的字典

重写create方法,实现序列化

在序列化类当中

如果不写的话调父类的,直接进入父类的create人家什么都不写直接抛异常,必须要你重写create,

会把校验通过的数据传过来,然后再return

    def create(self, validated_data):
        ret = models.Book.objects.create(**validated_data)
        return ret

使用继承了Serializers序列化类的对象,反序列化

ef post(self,request):
     #实例化产生一个类的对象
    bookser = BookSerializer(data=request.data)
    if bookser.is_valid():
        # 清洗通过的数据
        ret = bookser.create(bookser.validated_data)
    return Response()

用postman新增数据

技术图片

rest-framework序列化之ModelSerializer

 指定了表模型,使用serializer需要些好多字段,就要使用ModelSerializer,跟表模型对应上

技术图片

fileds=(‘nid‘,‘name‘) 指定序列化某几个字段

这样写也麻烦就用到depth,可以拿到所有字段的所有详情,没有办法控制它,必须要重写

官方建议,不要超过10,个人建议不要超过3

技术图片

使用继承了ModelSerializers序列化类的对象,反序列化新增数据

技术图片

 

反序列化校验(局部校验,全局校验)

 技术图片

技术图片

 总结

序列化组件
        -使用drf的序列化组件
            -1 新建一个序列化类继承Serializer
            -2 在类中写要序列化的字段
            
        -在视图中使用序列化的类
            -1 实例化序列化的类产生对象,在产生对象的时候,传入需要序列化的对象(queryset)
            -2 对象.data
            -3 return Response(对象.data)
        -高级用法:
            -source:可以指定字段(name   publish.name),可以指定方法,
            -SerializerMethodField搭配方法使用(get_字段名字)
                publish_detail=serializers.SerializerMethodField(read_only=True)
                def get_publish_detail(self,obj):
                    return name:obj.publish.name,city:obj.publish.city
            -read_only:反序列化时,不传
            -write_only:序列化时,不显示
            
            
    -序列化的两种方式
        -Serializers:没有指定表模型
            -source:指定要序列化哪个字段,可以是字段,可以是方法
            - SerializerMethodField的用法
                authors=serializers.SerializerMethodField()
                def get_authors(self,obj):
                     ret=AuthorSerializer(instance=obj.authors.all(),many=True)
                     return ret.data
            
        -ModelSerializers:指定了表模型
            class Meta:
                model=表模型
                #要显示的字段
                fields=(__all__)
                fields=(id,name)
                #要排除的字段
                exclude=(name)
                #深度控制
                depth=1
            -重写某个字段
                在Meta外部,重写某些字段,方式同Serializers
    -反序列化
        -使用继承了Serializers序列化类的对象,反序列化
            -在自己写的序列化类中重写create方法
            -重写create方法,实现序列化
                -在序列化类中:
                    def create(self, validated_data):
                        ret=models.Book.objects.create(**validated_data)
                        return ret
                -在视图中:
                    def post(self,request):
                        bookser=BookSerializer(data=request.data)
                        if bookser.is_valid():
                            ret=bookser.create(bookser.validated_data)
                        return Response()
            
        -使用继承了ModelSerializers序列化类的对象,反序列化
            -在视图中:
                def post(self,request):
                    bookser=BookSerializer(data=request.data)
                    if bookser.is_valid():
                        ret=bookser.save()
                    return Response()
            
    -反序列化的校验
        -validate_字段名(self,value):
            -如果校验失败,抛出ValidationError(抛出的异常信息需要去bookser.errors中取)
            -如果校验通过直接return value
        -validate(self,attrs)
            -attrs所有校验通过的数据,是个字典
            -如果校验失败,抛出ValidationError
            -如果校验通过直接return attrs
            
    -读一读源码
        -全局和局部钩子源码部分
        -在序列化的时候,传many=True和many=False,生成的对象并不是一个对象
        -bookser.data
            -之前执行过,直接返回
            -get_attribute(instance, self.source_attrs)
                -self.source_attrs 是source指定的通过 . 切分后的列表
                -instance 当前循环到的book对象

 

以上是关于反序列化之Serializers,ModelSerializers的主要内容,如果未能解决你的问题,请参考以下文章

序列化器反序列化的使用

DRF框架之 serializers 序列化组件

序列化组件(serializers)

ListModelSerializer模块

DJango反序列化器的参数效验

DJango反序列化器的参数效验