zoukankan      html  css  js  c++  java
  • 序列化组件

    序列化组件

    序列化组件介绍

    1 序列化,序列化器会把模型类对象转换成字典,经过response变成json字符串
    2 反序列化,把客户端发送过来的数据,经过request变成字典,序列化器可以把字典转成模型类对象
    3 反序列化,完成数据校检功能
    

    简单使用

    1 写一个序列化类,继承Serializer
    2 在类中写要序列化的字段
    3 在视图中使用,导入序列化类,实例化得到序列化的对象,把序列化对象传入
    4 序列化类的对象.data是一个字典
    5 把字典返回,使用rest_framework的Response,或者JsonResponse
    
    class BookSerializer(serializers.Serializer):
        name = serializers.CharField()
        price = serializers.CharField()
        author = serializers.CharField()
        publish = serializers.CharField()
    
    class BookAPIView(APIView):
        def get(self,request):
            book = Book.objects.all()
            boo_ser = BookSerializer(Book)#实例化得到序列化对象,把序列化对象传入
            return Response(boo_ser.data)#序列化类的对象.data是一个字典,用rest_framework的Response返回,或JsonResponse返回
    

    序列化的字段类型

    #常用的字段
    	CharField,必须参数max_length
    	IntegerField,
    	DateField,
    	DecimalField,参数ecimal_places=2#表示保留小数2位,max_digits=5#整数5位
    	BooleanField,#布尔类型
    	NullBooleanField,#可以为空的布尔类型
    	DateTimeField,参数auto_now_add=True##创建数据时自动把当前时间写入该字段auto_now=True#更新数据会更新该时间,只能同时存在一个
        ImageField(upload_to='icon',default='media/icon/default.png')#保存路径icon,默认的头像位置media/icon/default.png
    
    #字段参数
    max_length	最大长度
    min_lenght	最小长度
    allow_blank	是否允许为空
    trim_whitespace	是否截断空白字符
    max_value	最小值
    min_value	最大值
    
    #通用参数
    read_only	表明该字段仅用于序列化输出,默认False
    write_only	表明该字段仅用于反序列化输入,默认False
    required	表明该字段在反序列化时必须输入,默认True
    default	反序列化时使用的默认值
    allow_null	表明该字段是否允许传入None,默认False
    validators	该字段使用的验证器
    error_messages	包含错误编号与错误信息的字典
    label	用于HTML展示API页面时,显示的字段名称
    help_text	用于HTML展示API页面时,显示的字段帮助提示信息
    

    序列化组件完整使用

    Serializers
    ###ser.py
    #其他的校检方式,写一个函数,不要写在序列化类里,配置方式
    # 在author=serializers.CharField(validators=[check_author])
    def check_author(data):
        if data.startawith('sb') or data.endswith('sb'):
            raise ValidationError('author不能包含sb字符')
        else:
            return data
    
    class BookSerializer(serializers.Serializer):
        name = serializers.CharField()
        price = serializers.CharField()
        author = serializers.CharField(validators=[check_author])
    
        # 局部钩子,validate_需要校检的字段名
        def validate_price(self, data):
            print(type(data), data)
            if float(data) <= 1:
                raise ValidationError('价格太低了')  # 报校检错误
            else:
                return float(data)
    
        # 全局钩子,校检更多的字段
        def validate(self, attrs, ):
            author = attrs.get('author')
            # price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
            name = attrs.get('name')
            if author.startswith('sb') or author.endswith('sb'):
                raise ValidationError('author不能包含sb字符')
            if name.startswith('sb') or name.endswith('sb'):
                raise ValidationError('name不能包含sb字符')
            else:
                return attrs
    
    ModelSerializer、extra_kwargs(额外的键值)
    ###ModelSerializer
    from rest_framework import serializers
    from rest_framework.exceptions import ValidationError
    
    from app01.models import Book
    
    
    # ModelSerializer比Serializers多了update、create方法
    class BookModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book#序列化的模型类
            fields = '__all__'#‘__all__’所有,也可以自己指定('name','price')
            extra_kwargs = {  # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
                'id': {'read_only': True},
            } 
        #局部钩子,validate_需要校检的字段名
        def validate_price(self,data):
            print(type(data),data)
            if float(data) <= 1:
                raise ValidationError('价格太低了')#报校检错误
            else:
                return float(data)
        #全局钩子,校检更多的字段
        def validate(self, attrs,):
            author = attrs.get('author')
            # price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
            name = attrs.get('name')
            if author.startswith('sb') or author.endswith('sb'):
                raise ValidationError('author不能包含sb字符')
            if name.startswith('sb') or name.endswith('sb'):
                raise ValidationError('name不能包含sb字符')
            else:
                return attrs
    ###extra_kwargs(额外的键值)
        class Meta:
            model = Book
            fields = '__all__'
            extra_kwargs = {  # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
                'id': {'read_only': True},
            }
    read_only	表明该字段仅由于序列化输出
    write_only	表明该字段仅由于反序列化输入
    #了解
    required	表明该字段在序列化时必须输入
    default		反序列化时使用的默认值
    allow_null	是否允许传入none,默认False
    vilidators	该字段使用的验证器
    error_messages	包含错误编码与错误信息的字典
    
    many=True
    #获取所有,序列化多条数据,使用many=True
        books = Book.objects.all()
        book_ser=BookModelSerializer(books,many=True)
    
    source、SerializerMethodField()的使用
    #source
    	1 可以改字段名字,改成aaa,前端获取的就是aaa而不是数据库中真是的字段名
    	aaa=serializers.CharField(source='name')
    	2 可以跨表
    	aaa=serializers.CharField(source='publish.name')
    	3 可以执行方法,test是模型类Book中的方法
    	aaa=serializers.CharField(source='test')
    #SerializerMethodField(),它需要有个配套方法,get_字段名,返回值就是要那个字段的值
    	def get_author(self,instance):
        	authors = instance.authors.all()
        	list1=[]
        	for author in authors:
    			list.append({'name':author.name,'age':author.age})
    		return list1
    
    自己封装Response对象
    class MyResponse():
        def __init__(self):
            self.status = 100
            self.msg = '成功'
    
        @property
        def get_dict(self):
            return self.__dict__
    
    作者:linqiaobao
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    Linux软件安装之JDK的安装
    VMWARE虚拟机安装系统提示CPU已被客户机操作系统禁用和secureCUT乱码
    联网配置及静态更改
    全文搜索技术--Solr7.1之配置中文分析器
    全文搜索技术--solr7.1之mysql的安装步骤
    建立主从的九大步及配置哨兵
    mysql 模糊匹配优化(全文索引)
    微服务架构的身份验证解决方案
    spring声明式事务回滚
    spring 通过@responsebody接收多个对象参数
  • 原文地址:https://www.cnblogs.com/linqiaobao/p/13355744.html
Copyright © 2011-2022 走看看