zoukankan      html  css  js  c++  java
  • 序列化器反序列化的使用

    • 反序列化原理:

    Json字符串-->字典-->对象

    • 反序列化的作用:

    1.校验参数的准确性

    2.校验通过后,可以在数据库中保存或修改数据

    • 反序列化的使用:

    首先定义序列化器:

    class DepartmentSerializer(serializers.Serializer):
        """部门序列化器类"""
        id = serializers.IntegerField(read_only=True)
        name = serializers.CharField(max_length=20)
        create_date = serializers.DateField()
        is_delete = serializers.BooleanField(default=False)

    功能一:校验参数的准确性

    当我们想把一个字典转换为对象保存到数据库时,往往需要先校验其参数的准确性,有没有符合字段的约束。

    from [app文件夹].models import *
    from [app文件夹].serializers import *
    # 定义一个要保存到数据库的字典
    data_dict = {"name":"网络部","create_time":"2011-1-1"}
    # 校验参数
    a = DepartmentSerializer(data=data_dict)
    # 校验参数是否合法,校验通过返回True,否则返回False
    a.is_vaild()
    # 如果不通过,可以看错误在哪
    a.errors
    # 获取字典里能通过的键值对(不通过的时候是{})
    a.validated_data

    补充:is_valid()可以抛出异常,写法:is_valid(raise_exception=True)。当然,抛了异常后下面的代码就不会执行了。

    如果默认的字段类型和选项不能满足校验的需求,可以自定义补充校验

    (1)通过validators选项进行校验

    # 函数的名字和接受的参数名都可以随便写
    def jiaoyan(value):
        if not re.match('^[u4e00-u9fa5]+$',value):
            # 异常名称是固定的!
            raise ValidationError("部门只能为中文")
        return value
    
    class DepartmentSerializer(serializers.Serializer):
        """部门序列化器类"""
        id = serializers.IntegerField(read_only=True)
        # validators指定校验器的名称
        name = serializers.CharField(max_length=20,validators=[jiaoyan])
        create_date = serializers.DateField()
        is_delete = serializers.BooleanField(default=False)

    (2)validate_<field>:对<field_name>字段进行验证

    class DepartmentSerializer(serializers.Serializer):
        """部门序列化器类"""
        id = serializers.IntegerField(read_only=True)
        # validators指定校验器的名称
        name = serializers.CharField(max_length=20)
        create_date = serializers.DateField()
        is_delete = serializers.BooleanField(default=False)
    
        # 函数的名字是固定的,validate_加上要校验的字段名
        def validate_name(self,value):
            if not re.match('^[u4e00-u9fa5]+$', value):
                # 异常名称是固定的!
                raise ValidationError("部门只能为中文")
            return value

    (3)validate:同时对多个字段进行比较验证

    例如,注册时验证用户输入的两个密码是否一致:

    class UserSerializer(serializers.Serializer):
    
         password = serializers.CharField(max_length=30, write_only=True)
         password2 = serializers.CharField(max_length=30, write_only=True)
         # 函数名是固定的!
         def validate(self, attrs):
             # 新增用户时客户端传递请求参数:
             # {"name":"Jack",  "password": "123456", "password2":"123456"}
             # attrs这个名字可以随便写,代表着整个字典
             password = attrs['password']
             password2 = attrs['password2']
             if password != password2:
                 # 异常名称固定!
                 raise ValidationError('两次输入的密码不一样')
             return attrs

    功能二:把校验通过的字典转换为对象,新增或修改

    1.重写序列器类的create函数(新增)和update函数(修改)

    class DepartmentSerializer(serializers.Serializer):
        """部门序列化器类"""
        id = serializers.IntegerField(read_only=True)
        name = serializers.CharField(max_length=20)
        create_date = serializers.DateField()
        is_delete = serializers.BooleanField(default=False)
    
        def create(self, validated_data):
            # validated_data是校验通过的有序字典
            # 方式一,增加数据
            dep = Department.objects.create(name=validated_data.get("name"),create_date=validated_data.get("create_date"))
            # 方式二,增加数据
            dep = Department.objects.create(**validated_data)
            return dep
    
        def update(self, instance, validated_data):
            # instance表示的是待修改的对象,需要先查询出来。
         # validated_data是校验通过的字典
         # get后面设置默认值,是为了防止没有修改该字段时,没有接收到值,从而给对象原本的值设置为空
    instance.name = validated_data.get("name",instance.name) instance.create_date = validated_data.get("create_date",instance.create_date) instance.save() return instance

    2.使用

    from user.serializers import *
    from user.models import *
    
    # 新增操作
    a = DepartmentSerializer(instance=None,data={"name":"英语角","create_date":"2001-1-1"})
    a.save()
    
    # 修改操作
    dep = Department.objects.get(id=6)
    a = DepartmentSerializer(instance=dep,data={"name":"英语角","create_date":"2001-1-1"})
    a.save()

    注意:当只修改部分字段时,可以通过设置partial=True允许只修改部分字段。示例:

    dep = Department.objects.get(id=8)
    s = DepartmentSerializer(dep, data={'create_date': '2017-1-1'}, partial=True)
    s.is_valid()
    s.save()
  • 相关阅读:
    django在admin后台注册自己创建的数据库表
    django的缓存机制
    python中eval函数作用
    falsk之文件上传
    django请求的生命周期
    mongodb高级操作
    mongodb基本操作
    mongodb安装教程
    flask之jinjia2模板(二)
    Maven系列--"maven-compiler-plugin"的使用、Maven之Surefire插件
  • 原文地址:https://www.cnblogs.com/chichung/p/9938453.html
Copyright © 2011-2022 走看看