Django框架中序列化和反序列化的例子

1.序列化

DRF的核心 就是 前后端分离的核心

前后端分离开发的核心:

将模型转换为json 称之为 序列化

将json转换为模型 称之为 反序列化

1.序列化器的字段

Serializer 序列化器

为了得到模型里的字段,序列化器中的字段应与模型类中的字段名一致

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  # read_only=True 只能读 不能修改
  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharField(max_length=20,label='书籍名')
  pub_date = serializers.DataField(label='发布日期')
  readcount = serializers.IntegerField()
  is_delete = serializers.BooleanField()
  image = serializers.ImageField()

2.序列化

创建序列器

序列化器的第一个参数:instance 用于序列化操作

序列化器的第二个参数:data 用于反序列化操作

除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如

serializer = AccountSerializer(account, context={'request': request})

通过context参数附加的数据,可以通过Serializer对象的context属性获取。

 ''' views.py '''

 book = BookInfo.objects.get(id=2)

 s = BookInfoSerializers(instance=book)

 # 我们是通过 序列化器的data属性来获取 模型转换为字典的数据
 s.data

 # 传递多个数据
 # 应用: 查询所有书籍列表

 books = BookInfo.objects.all()
 # 创建序列化器,将所有书籍信息传递给序列化器
 # books = [BookInfo,BookInfo,...] 对象列表
 s = BookInfoSerializers(books,many=True)

 person = PeopleInfo.objects.get(id=6)

 # 序列化器初始化
 s = PeopleInfoSerializer(instance=person)

3.关联序列化器的操作

对于关联字段,可以采用以下几种方式:

1) PrimaryKeyRelatedField

2) StringRelatedField

3) 使用关联对象的序列化器

#########关联序列化器##########################

 class PeopleInfoSerializer(serializers.Serializer):
  """英雄数据序列化器"""
  GENDER_CHOICES = (
   (0, 'male'),
   (1, 'female')
  )
  id = serializers.IntegerField(label='ID', read_only=True)
  name = serializers.CharField(label='名字', max_length=20)
  gender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)
  description = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)

  ''' PrimaryKeyRelatedField '''
  # 设置关联外键的时候,要将 read_only=True
  # 包含read_only=True参数时,该字段将不能用作反序列化使用
  # book = serializers.PrimaryKeyRelatedField(read_only=True,label='外键')
  # 或者
  # 包含queryset参数时,将被用作反序列化时参数校验使用
  # queryset 将关联模型的所有数据传递给这个属性就可以
  book = serializers.PrimaryKeyRelatedField(label='外键',queryset=BookInfo.objects.all())

  '''StringRelatedField'''
  # 现在通过 PrimaryKeyRelatedField得到的是一个 外键的一个值 2
  # 接下来通过 一个设置 来获取 书籍的名字

  # StringRelatedField 可以获取关联模型中的 __str_ 里的字符串
  book = serializers.StringRelatedField()

  ''' 使用关联对象的序列化器 拿到所有数据 '''
  book = BookInfoSerializer()

4.关联查询

关联模型类名小写_set 作为字段名

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharFIeld(max_length=20,label='书籍名')
  pub_date = serializers.DataField(label='发布日期')
  readcount = serializers.IntegerField()
  is_delete = serializers.BooleanField()
  iamge = serializers.ImageField()

  # 书籍和人物的关系是 1:n ===> many=True
  peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)

  def __str__(self):
   return self.name

2.反序列化

反序列化 分为两个:

数据校验

数据入库

2.1 数据校验

使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。

在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。

验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。

验证成功,可以通过序列化器对象的validated_data属性获取数据。

在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为

1. 数据校验的第一种方式

在定义序列化器字段的时候,规定是什么类型 就要提交符合规则的数据

例如:DateField 就需要传入符合日期规则的数据

 ##############将JSON转换为模型 反序列化#############

  ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharFIeld(max_length=20,label='书籍名')
  pub_date = serializers.DataField(label='发布日期')

  peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)

  def __str__(self):
   return self.name

 ''' views.py '''

 dict = {
  'name':'itcast',
  'pub_date':'123' # Flase
  # 'pub_date':'2010-1-1' # True
 }

 # 1.创建序列器
 # 序列化器的第一个参数:instance 用于序列化操作
 # 序列化器的第二个参数:data 用于反序列化操作
 serializer = BookInfoSerializer(data=dict)

 # 2.需要调用序列化器的 is_valid 方法 valid验证 返回True False
 # 如果数据可用 返回True
 serializer.is_valid()

 # raise_exception=True 可以设置为True 来抛出异常
 serializer.is_valid(raise_exception=True)

2.数据校验的第二种方式

字段的选项

required : 进行反序列化的时候,必须传这个字段

min_length,max_length 作用于字符串

min_value,max_value 作用于Int整型

default 不传入数据 设置默认值

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharFIeld(min_length=5,max_length=20,label='书籍名',)
  pub_date = serializers.DataField(label='发布日期',required=True)

  def __str__(self):
   return self.name

 ''' views.py '''
 dict = {
  'name':'itcast',
  'pub_date':'123' # 若去掉pub_date 则报错
 }

3.数据校验的第三种方式

对单个字段的数据进行验证

语法形式为: 在序列化器中实现方法 def validate_字段名()

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharFIeld(min_length=5,max_length=20,label='书籍名',)
  pub_date = serializers.DataField(label='发布日期',required=True)
  readcount = serializers.IntegerField(default=0,required=False)

  def __str__(self):
   return self.name

  def validate_readcount(self,value):
   # value 就是字段传递过来的数据
   if value < 0:
    raise serializers.ValidationError('阅读量不能为负数')

   # 需要将value返回回去
   return value

 ''' views.py '''
 dict = {
  'name':'itcast',
  'readcount':-20, # 报异常
 }

4.数据校验的第四种方式

对多个字段的数据进行验证时

语法形式为: 在序列化器中实现方法 def validate(self,attrs)

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  id = serializers.IntegerField(read_only=True,label='id')
  name = serializers.CharFIeld(min_length=5,max_length=20,label='书籍名',)
  pub_date = serializers.DataField(label='发布日期',required=True)
  readcount = serializers.IntegerField(default=0,required=False)
  commentcount = serializers.IntegerField(default=0,required=False)

  def __str__(self):
   return self.name

  # 对多个字段进行验证
  # def validate(self,attrs):
  def validate(self,data):
   # attrs --> 其实就是data
   readcount = data.get('readcount')
   commentcount = data['commentcount']

   if readcount < commentcount:
    raise serializers.ValidationError('评论量不能大于阅读量')

   # 要将数据返回
   return data

 ''' views.py '''
 # 自定义需求:评论量不能大于阅读量
 dict = {
  'name':'itcast',
  'readcount':20,
  'commentcount':100
 }

5.数据校验的第五种方式

自定义验证方法

同时给字段添加自定义验证方法

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  # 自定义验证方法
  def custom_validate(self):
   if self == 'admin':
   raise serializers.ValidationError('我就是来捣乱的')

  id = serializers.IntegerField(read_only=True,label='id')

  # validators=[] 是给字段 添加自定义验证方法
  name = serializers.CharFIeld(min_length=5,max_length=20,label='书籍名',validators=[custom_validate])

  def __str__(self):
   return self.name

 ''' views.py '''
 # 规定:评论量不能大于阅读量
 dict = {
  'name':'itcast',
  'readcount':20,
  'commentcount':100
 }

2.2 数据入库

6.数据保存 save方法

继承自Serializer的序列化 我们在调用save方法的时候,需要手动实现create方法,

调用save方法之前,必须调用 is_valid方法,

即 要想保存数据,必须保证数据是经过校验的。

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  def create(self,validated_data):

   # dict --> data --> attrs --> validated_data
   # validated_data 此处其实就是views.py中的dict
   # validated_data 已经被验证过的数据

   # * 对列表进行解包 *list
   # ** 对字典进行解包 **dict
   # 此处解包 将dict中的值 赋值给对象中的对应字段
   book = BookInfo.objects.create(**validated_data)

   # create 需要将创建的对象返回
   return book 

  ''' views.py '''

 # 规定:评论量不能大于阅读量
 dict = {
  'name':'itcast',
  'readcount':20,
  'commentcount':100
 } 

 serializer = BookInfoSerializer(data=dict)
 serializer.is_valid(raise_exception=True)

 # 3. 保存需要调用序列化器的save方法
 # 继承自Serializer的序列化 我们在调用save方法的时候,需要手动实现create方法
 serializer.save()

7.序列化器中传入两个参数,即数据的更新操作

如果我们在序列化器中既传入了对象,又传入了数据

系统会认为我们在更新数据

继承自Serializer的类,要更新数据的时候,需要手动实现update方法

 ''' serializers.py '''

 class BookInfoSerializer(serializers.Serializer):

  def update(self,instance,validated_data):
   # instance : 就是我们在更新数据时,传入序列化器的对象
   # validated_data : 验证之后的数据

   instance.name = validated_data.get('name',instance.name)
   instance.pub_date = validated_data.get('pub_date',instance.pub_date)
   instance.readcount = validated_data.get('readcount',instance.readcount)
   instance.commentcount = validated_data.get('commentcount',instance.commentcount)

   instance.save()

   # update()方法需要我们手动返回对象
   return instance

 '''views.py '''

 # 1.获取对象
 book = BookInfo.objects.get(id=2)
 # 2.保存数据
 data = {
  'name':'lalala',
  'pub_date':'2018-1-1',
  'readcount':1000,
  'commentcount':10
 } 

 # 3.创建序列化器
 s = BookInfoSerializer(instance=book,data=data)
 # 4.验证数据
 s.is_valid(raise_exception=True)
 # 5.保存数据
 s.save()

3.ModelSerializer

如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。

ModelSerializer与常规的Serializer相同,但提供了:

基于模型类自动生成一系列字段

包含默认的create()和update()的实现

 ''' serializers.py '''

 class BookSerializer(serializers.ModelSerializer):

  # 如何设置 通过class Meta
  class Meta:
   model = BookInfo # 设置关联模型  model就是关联模型
   # fields = '__all__' # fields设置字段 __all__表示所有字段
   # fields = ['id','name','pub_date'] # fields设置字段 []列表显示来设置
   exclude = ['image'] # exclude 排除列表中的字段,剩余的字段都显示

   read_only_fields = ('id','readcount','commentcount')

   # 我们可以对自动生成的字段 进行额外的设置
   extra_kwargs = {
    # 字段名:{选项:值}
    'pub_date':{'required':True},
    'readcount':{
     'max_value':10000,
     'min_value':0
    }
   }

 '''views.py'''

 #########ModelSerializer##############
 data = {
   'name':'abc',
   'pub_date':'2018-1-1',
   'readcount':1000,
   'commentcount':10
  } 

 s = BookSerializer(data=data)
 s.is_valid(raise_exception=True)
 s.save()

以上这篇Django框架中序列化和反序列化的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python Json序列化与反序列化的示例

    不同的编程语言有不同的数据类型; 比如说: Python的数据类型有(dict.list.string.int.float.long.bool.None) Java的数据类型有(bool.char.byte.short.int.long.float.double) C的数据类型有(bit.bool.char.int.short.long.unsigned.double.float) Tcl的数据类型(int.bool.float.string) Ruby的数据类型(Number.String.R

  • 详解django的serializer序列化model几种方法

    序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据 方法一:通过继承View类,重写get方法,获取商品的前是前十条数据,通过serialize序列化数据,返回数据响应. from django.views.generic import View from goods.models import Goods from django.core import serializers from django.htt

  • 详解Python中的序列化与反序列化的使用

    学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化.所以直接使用marshal来序列化/反序列化可能不是很方便.还好,python标准库提供了功能更加强大且更加安全的pickle和cPickle模块. cPickle模块是使用C语言实现的,所以在运行效率上比pickle要高.但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们

  • 老生常谈Python序列化和反序列化

    通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功能. pickle模块 存储在变量中 dumps(obj)返回存入的字节 dic = {'age': 23, 'job': 'student'} byte_data = pickle.dumps(dic) # out -> b'\x80\x03}q\x00(X\x03\x00\x00\...' print(byte_data)

  • django Serializer序列化使用方法详解

    Serializer序列化器 定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer. 例如,我们已有了一个数据库模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = mode

  • Python pickle类库介绍(对象序列化和反序列化)

    一.pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: 复制代码 代码如下: pickle.dump() pickle.load() 如果要实现python对象和字符串间的序列化和反序列化,则使用: 复制代码 代码如下: pickle.dumps() pickle.loads() 可以被序列化的类型有: * None,True 和 False; * 整数,浮点数

  • Django框架中序列化和反序列化的例子

    1.序列化 DRF的核心 就是 前后端分离的核心 前后端分离开发的核心: 将模型转换为json 称之为 序列化 将json转换为模型 称之为 反序列化 1.序列化器的字段 Serializer 序列化器 为了得到模型里的字段,序列化器中的字段应与模型类中的字段名一致 ''' serializers.py ''' class BookInfoSerializer(serializers.Serializer): # read_only=True 只能读 不能修改 id = serializers.

  • django框架中ajax的使用及避开CSRF 验证的方式详解

    本文实例讲述了django框架中ajax的使用及避开CSRF 验证的方式.分享给大家供大家参考,具体如下: ajax(Asynchronous Javascript And Xml) 异步javascript和XML ajax的优点 使用javascript技术向服务器发送异步请求 ajax无须刷新整个页面: 由于ajax响应的是局部页面,因此性能要高 当以get的方式向服务器发送请求: views.py def user_valid(request): name=request.GET.get

  • Flask和Django框架中自定义模型类的表名、父类相关问题分析

    本文实例分析了Flask和Django框架中自定义模型类的表名.父类相关问题.分享给大家供大家参考,具体如下: 一. Flask和Django中定义表名(执行迁移后生成)的方式和flask是不同的: 1. Django中表名的定义方式,以代码为例说明 class User(AbstractUser): # 继承自认证系统模型类 """用户模型类""" mobile = modles.CharField(max_length=11, mix_len

  • python django框架中使用FastDFS分布式文件系统的安装方法

    一.安装FastDFS 1-1:执行docker命令安装 # 安装tracker docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs youkou1/fastdfs tracker # 安装storage docker run -dti --network=host --name storage -e TRACKER_SERVER=IP地址:22122 -v /var/fdfs/storage:

  • Django框架中视图的用法

    视图层 一个视图函数,简称视图,是一个简单的 Python 函数,它接受 Web 请求并且返回 Web 响应. 响应可以是一个 HTML 页面.一个 404 错误页面.重定向页面.XML 文档.或者一张图片... 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里都可以,只要在 Python 目录下面,一般放在项目的 views.py 文件中. 每个视图函数都负责返回一个 HttpResponse 对象,对象中包含生成的响应. 视图层中有两个重要的对象:请求对象(request)与响应对象(H

  • Go语言中序列化与反序列化示例详解

    目录 前言 序列化 array.slice.map.struct对象 序列化的接口 反序列化 slice.map.struct反序列化 总结 前言 Go语言的序列化与反序列化在工作中十分常用,在Go语言中提供了相关的解析方法去解析JSON,操作也比较简单 序列化 // 数据序列化 func Serialize(v interface{})([]byte, error) // fix参数用于添加前缀 //idt参数用于指定你想要缩进的方式 func serialization (v interfa

  • Java中序列化和反序列化的完整讲解

    目录 一.序列化 二.序列化和反序列化的应用 三.序列化和反序列化地实现 3.1.JDK类库提供的序列化API 3.2.序列化要求 3.3.实现java序列化和反序列化的三种方法 四.CustomerForm 类序列化和反序列化演示 五.Externalizable接口实现序列化与反序列化 5.1.Externalizable 的不同点 5.2.CustomerForm 实现类 Externalizable 5.3.Externalizable 实现序列化和反序列化 总结 一.序列化 1.1.S

  • 在Python的Django框架中加载模版的方法

    为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS = ( # Put strings here, li

  • 对Python的Django框架中的项目进行单元测试的方法

     Python中的单元测试 我们先来回顾一下Python中的单元测试方法. 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的: def division_funtion(x, y): return x / y 但是这样写究竟对还是不对呢,有些同学可以在代码下面这样测试: def division_funtion(x, y): return x / y if __name__ == '__main__': print division

  • 详解在Python的Django框架中创建模板库的方法

    不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 manage.py startapp 创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用. 我们更推荐使用后者,因为你的filter可能在后来的工程中有用. 无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中. 我们稍后会解释这一点. 第二,在适当的Django应用包里创

随机推荐