序列化器反序列化的使用

  • 反序列化原理:

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()

原文地址:https://www.cnblogs.com/chichung/p/9938453.html

时间: 2024-10-04 18:01:43

序列化器反序列化的使用的相关文章

drf序列化器的实例

应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views import View from django.http import JsonResponse, QueryDict from bookset.models import BookInfo #导入序列化列 from .serializers import BookInfoSerializer #####

pull解析器: 反序列化与序列化

pull解析器:反序列化 读取xml文件来获取一个对象的数据 1 import java.io.FileInputStream; 2 import java.io.IOException; 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.xmlpull.v1.XmlPullParser; 7 import org.xmlpull.v1.XmlPullParserException; 8 import or

drf序列化器与反序列化

什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 """ 序列化:Model类对象转换为字符串用于传输 反序列化:字符串转换为Model类对象用于使用 """ Model类 创建数据库:终端 >: mysql -uroot -p密码 >: create database 数据库名 charse

序列化与反序列化总结(Serializable和Parcelable)

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程. 在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用, 但是一旦JVM停止,这些对象的状态也就丢失了. 在实际生活中,需要将对象持久化,需要的时候再重新读取出来,通过对象序列化,可以将对象的状态保存为字节数组,需要的时候再将字节数组反序列化为对象. 对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间转换,广泛用于RMI(远程方法调用)以

Json数据的序列化与反序列化的三种常用方法介绍

以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方..还请各位读者批判性对待... 本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间 的比较...希望能够对读者们有一些帮助... 这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法.使用gson解析与生成JSON数据 .使用fastJsson解析与生成JSON数据. 首先,这些工具都可以到

C#对象序列化与反序列化

1.对象序列化的介绍 (1).NET支持对象序列化的几种方式 二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下. SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.

XML 序列化与反序列化

XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param name="type">对象类型</param> /// <param name="obj">对象</param> /// <param name="fileName">序列化的XML文件路径<

Java对象表示方式1:序列化、反序列化和transient关键字的作用

http://www.cnblogs.com/xrq730/p/4821958.html 平时我们在Java内存中的对象,是无 法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即 存储对象中的状态.一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化.换句话说,序列化只是表示对 象的一种方式而已.OK,有了序列化,那么必然有反序列化,我们先看一下序列化.反序

序列化和反序列化

两种方法: 1.using System.Runtime.Serialization.Formatters.Binary;//二进制序列化器所在命名空间2.using System.Runtime.Serialization.Formatters.Soap;//using System.IO;//流的 反序列化:流--->对象 一个类要想能够序列化,需要给这个类加一个attribute:即在类的定义之前加[Serializable],写在using xxxx  下面,命名空间之外. 二进制格式化