序列化器反序列化的使用
Posted chichung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化器反序列化的使用相关的知识,希望对你有一定的参考价值。
-
反序列化原理:
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=dep,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()
以上是关于序列化器反序列化的使用的主要内容,如果未能解决你的问题,请参考以下文章