• 序列化组件(serializers)


    序列化组件

    序列化目的: 格式化对象成我们要传递的数据

    反序列化目的: 校验数据过程

    初级版 1.0

    注意的点:

    1. 序列化中传入数据库中查询出来的queryset对象,序列化为可以使用Response传递的数据
    2. 自己定义继承serializers.Serializer之后, 里面填写的字段名要与models.py中对应的表中的字段一样的名字, 因为他是根据反射来查找的
    3. 序列化可以自定义字段名以及返回值(但是名字一定要不一样),下面代码中有自定义字段
    4. 反序列化类似于Django中的forms组件, 就是用来校验数据的安全性, 有局部钩子,以及全局钩子
    5. 重写create方法def create(self, validated_data):
    6. 反序列化成功之后 反序列化产生的对象.save()会调用重写的create方法,完成数据库的数据保存
    7. 反序列化中的字段必须和前台传过来的字段一一对应,不然如果反序列化中没有,并且models中没有默认值,就会保存null,有默认值传默认值,没默认值保存null,而不是保存传过来的数据
    # 序列化
    class MySerializers(serializers.Serializer):
        name = serializers.CharField()
        color = serializers.IntegerField()
        price = serializers.DecimalField(max_digits=10, decimal_places=2)
        img = serializers.FileField()
        brand = serializers.CharField()
    	# 自定义字段
        hue = serializers.SerializerMethodField()
        car_img = serializers.SerializerMethodField()
    	# 自定义字段的方法:方法名固定格式 get_原表中的字段名(self, obj)
        def get_car_img(self, obj):
            # 规定自定义字段的返回值
            return 'http://127.0.0.1:8000/media/' + str(obj.img)
    
        def get_hue(self, obj):
            return obj.get_color_display()
    	
    # 反序列化
    class MyDeSerializers(serializers.Serializer):
        # 反序列化中的规定的数据会得到一个检索
        name = serializers.CharField(min_length=3, max_length=8, error_messages={
            'min_length': '最短也得三个',
            'max_length': '最长也得八个',
            'required': '不可以不传'
        })
        color = serializers.IntegerField()
        price = serializers.DecimalField(max_digits=10, decimal_places=2)
       	brand = serializers.CharField()
        
        # 局部钩子
        def validate_name(self, value):
            if 'a' in value:
                raise serializers.ValidationError({'name': '名字中不可以带有小写a'})
            return value
    	# 全局钩子
        def validate(self, attrs):
            # attrs就是一个字典
            name = attrs.get('name')
            if 'b' in name:
                raise serializers.ValidationError({'name': '用全局钩子校验名字, 名字不可以有小写b'})
            return attrs
        # 重写self方法, 保存数据到数据库,validated_data是字典, 检验成功自动保存
        def create(self, validated_data):
            return models.Car.objects.create(**validated_data)
    
    
    # view.py
    class UserMsg(APIView):
        def get(self, request, *args, **kwargs):
            car_id = kwargs.get('pk', None)
            if car_id:
                car_obj = models.Car.objects.filter(pk=car_id).first()
                result = MySerializers(car_obj, many=False).data
                return Response({'msg': '单查', 'result': result})
            else:
                # 群查是多个obj [{}, {}],设置many为True
                car_obj_lis = models.Car.objects.all()
                result = MySerializers(car_obj_lis, many=True).data
                return Response({'msg': '群查', 'result': result})
    
        def post(self, request, *args, **kwargs):
            post_msg = request.data
            obj = MyDeSerializers(data=post_msg) # 返序列化要 data=传过来的数据
            if obj.is_valid():
                # 如果数据正确
                return Response({'msg': 'post请求'})
            return Response({'error': obj.errors})
    
  • 相关阅读:
    css3——box-sizing属性
    HTML5存储--离线存储
    微信公众号爆出前端安全漏洞
    Js获取宽高度的归纳集锦总结
    Yii 2 修改 URL 模式为 PATH 模式,并隐藏index.php
    SQL 查询优化 索引优化
    linux提示语言包
    安装linux工作环境
    linux常用命令
    PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11900657.html
Copyright © 2020-2023  润新知