1、序列化和反序列化
变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

序列化是将对象状态转换为可保持或可传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。

2、Django中序列化器的定义和使用
定义:两种方法定义序列化器(serializer/ModelSerializer)

class CartSKUSerializer(serializers.ModelSerializer):
"""
购物车商品数据序列化器
"""
count = serializers.IntegerField(label='数量') class Meta:
model = SKU
fields = ('id', 'name', 'default_image_url', 'price', 'count')

使用:
  查询模型类
  实例一个序列化器,传入模型类对象
  获取序列化后的结果(data属性)

query_set = Department.objects.all()
serializer = DepartmentSerializer(query_set, many=True)# 传入对象集时需指定many=True
serializer.data

3、Django中反序列化的参数校验
基本校验:
  序列化器的创建: 通过data传入字典数据:

Serializer(instance=None, data=empty, **kwarg)

  通过is_valid方法校验参数合法性
  errors属性: 获取校验出错信息,字典类型。
  validated_data属性: 校验通过得到的对象,类型为OrderedDict
通过 validators选项校验
  在序列化器字段中添加validators选项参数进行校验
  定义函数:

def validate_name(value):
# 校验部门名称
if not re.match('^[\u4e00-\u9fa5]+$', value):
raise ValidationError('部门名称只能为中文')
return value

  在字段参数中添加选项:validators=[validate_name]

name = serializers.CharField(validators=[validate_name])

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

    class DepartmentSerializer(serializers.Serializer):
"""部门数据序列化器"""
...
def validate_name(self, value):
# 校验部门名称
if not re.match('^[\u4e00-\u9fa5]+$', value):
raise ValidationError('部门名称只能为中文')
return value

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

     # 模型: users/models.py
class User(models.Model):
password = models.CharField(max_length=30) # 序列化器: users/serializer.py
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):
# 校验两次输入的密码是否正确
password = attrs['password']
password2 = attrs['password2']
if password != password2:
raise serializers.ValidationError('两次输入的密码不一样')
return attrs

3、Django中反序列化保存和修改数据

  1. Serializer类的三个方法

    • save()方法: 保存数据
    • create()方法: 新增数据
    • update()方法: 修改数据
  2. 新增或修改数据

    Serializer(instance=None, data=empty)
    1. 新增:创建序列化器时,没有传递了instance参数

       my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}
      s = DepartmentSerializer(data=my_dict)
      s.save() # 新增
    2. 修改:创建序列化器时,传递了instance参数

      department = Department.objects.get(id=1)
      my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}
      s = DepartmentSerializer(instance=department, data=my_dict)
      s.save() # 修改
    3. 部分修改:partial=True 参数

      1. 当修改数据时,序列化器默认要求传递所有required=True的字段,否则is_valid验证不通过
      2. 可以通过设置partial=True允许只修改部分字段,如下:

s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)

4、模型类序列化器

定义
  model 指明参照哪个模型类
  fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)

class DepartmentSerializer2(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__' # 包含模型类中所有的字段

指定序列化器中包含哪些字段:fields = ('id', 'name')
排除掉模型类中指定的字段:exclude = ('is_delete',)
指明只读字段
  read_only_fields = ('id', 'create_date')
  仅用于序列化输出,在反序列化时不会进行校验和修改
指定 关联属性的序列化方式

Django:(08)序列化器的更多相关文章

  1. 怎样快速高效的定义Django的序列化器

    1.使用Serializer方法自己创建一个序列化器 先写一个简单的例子 class BookInfoSerializer(serializers.Serializer): ""& ...

  2. Django REST framework 中的序列化器

    在此之前定义一个序列化工具:     views中的的代码 from rest_framework.viewsets import ModelViewSet from .models import B ...

  3. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  4. Django REST Framework的序列化器是什么?

    # 转载请留言联系 用Django开发RESTful风格的API存在着很多重复的步骤.详细可见:https://www.cnblogs.com/chichung/p/9933861.html 过程往往 ...

  5. Django REST Framework序列化器

    Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...

  6. Django 学习之Django Rest Framework_序列化器_Serializer

    作用: 1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串. 2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型. 3 ...

  7. ajax发送json格式与文件数据、django自带的序列化器(了解)

    上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...

  8. Django:RestFramework之-------序列化器

    8.序列化 功能: 对请求数据进行验证 对Queryset进行序列化 8.1一个简单序列化: import json from api import models from rest_framewor ...

  9. 序列化器:ModelSerializer

    ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...

随机推荐

  1. Python+request 登录接口reponse的返回值token跨py文件的传递《二》

    主要使用场景: 一般我们在进行接口测试时,依赖登录接口后reponse中的某些返回值,因此需要将login接口单独写一个py文件,另外的py文件均可调用login的reponse返回值使用.共用登录接 ...

  2. Django 数据库mysql到models的映射方法

    Django自动生成models 如果数据库表已经存在,执行命令,可以自动生成Models模型,实现models与数据表的映射 >>> python manage.py inspec ...

  3. 24、自动装配-@Profile环境搭建

    24.自动装配-@Profile环境搭建 Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能. 开发环境.测试环境.正式环境 数据源切换 24.1 添加 数据源和jdbc驱动 ...

  4. 「LOJ 121」「离线可过」动态图连通性「按时间分治 」「并查集」

    题意 你要维护一张\(n\)个点的无向简单图.你被要求执行\(m\)条操作,加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询两个点是否联通. ...

  5. SIGCHLD函数

    SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 借助SIGCHLD信号回收子进程 子进程结束运行,其父进程会收到SIGCH ...

  6. JAVA基础知识|内部类

    一.什么是内部类? 内部类(inner class)是定义在另一个类中的类 为什么使用内部类? 1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据 2)内部类可以对同一个包中的其他类隐藏 ...

  7. Python语法 - 生成器

    生成器基本概念 1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束 2 生成器表达式能做的事情列表解析基本都能处理,只不 ...

  8. 使用 Linux Mint 作为主要操作系统的一些个人常用软件

    本篇文章讲一下一些 Linux 上的应用,多数为日常生活娱乐用的软件,同时也会讲一点开发工具,对于有兴趣继续研究 Linux 的可以参考一下. 目录 软件的安装方式 1.Software Manage ...

  9. 拆分项目搞成framework 实例

    目前工作中遇到的问题,是讲项目三大模块拆分, 将Discover.Shop和Events的源代码拆分到独立的项目中 拆分是个麻烦事,里面相互依赖很多 ,打包编译也异常复杂,各种报错 编译Event 遇 ...

  10. java实现磁盘先来先服务算法

    package demo; import java.awt.List; import java.util.ArrayList; import java.util.Arrays; public clas ...