Django:(08)序列化器
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中反序列化保存和修改数据
Serializer类的三个方法save()方法: 保存数据create()方法: 新增数据update()方法: 修改数据
新增或修改数据
Serializer(instance=None, data=empty)
新增:创建序列化器时,没有传递了
instance参数my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}
s = DepartmentSerializer(data=my_dict)
s.save() # 新增修改:创建序列化器时,传递了
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() # 修改部分修改:
partial=True参数- 当修改数据时,序列化器默认要求传递所有
required=True的字段,否则is_valid验证不通过 可以通过设置
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)序列化器的更多相关文章
- 怎样快速高效的定义Django的序列化器
1.使用Serializer方法自己创建一个序列化器 先写一个简单的例子 class BookInfoSerializer(serializers.Serializer): ""& ...
- Django REST framework 中的序列化器
在此之前定义一个序列化工具: views中的的代码 from rest_framework.viewsets import ModelViewSet from .models import B ...
- 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用
写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...
- Django REST Framework的序列化器是什么?
# 转载请留言联系 用Django开发RESTful风格的API存在着很多重复的步骤.详细可见:https://www.cnblogs.com/chichung/p/9933861.html 过程往往 ...
- Django REST Framework序列化器
Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...
- Django 学习之Django Rest Framework_序列化器_Serializer
作用: 1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串. 2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型. 3 ...
- ajax发送json格式与文件数据、django自带的序列化器(了解)
上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...
- Django:RestFramework之-------序列化器
8.序列化 功能: 对请求数据进行验证 对Queryset进行序列化 8.1一个简单序列化: import json from api import models from rest_framewor ...
- 序列化器:ModelSerializer
ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...
随机推荐
- unittest简单使用的介绍
无论是paython+request接口测试.ui自动化测试等,都常会用到unittest的框架,简单的介绍如下:
- a标签中的javascript:void(0)和#的区别
#包含了一个位置信息 默认的锚是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 void(0)用于执行某些处理,但是不整体刷新页面 javascript:v ...
- mysql sql语句多表合并UNION ALL和UNION
select d1.ID,CAST(d1.ID AS CHAR) AS intId, d1.CODE_TYPE, d1.CODE, d1.CODE_IMG, d1.VALUE from m_dict_ ...
- (Java基础--反射)框架的概念及用反射技术开发框架的原理
一.概述 1.框架:通过反射调用Java类的一种方式. (框架与房子非常类似,使用的用户写的程序写配置文件,就相当于给房子装修) 如房地产商造房子用户住,门窗和空调等等内部都是由用户自己安装,房子就 ...
- java内存溢出定位
一.内存溢出问题分类 瞬时流量过大造成的创建大量对象 内存泄漏导致的内存溢出,一般就是程序编码的BUG引起的 二.内存泄漏问题分析 step1: 收集内存泄漏的堆内存异常日志 > 添加HeapD ...
- @ControllerAdvice与@ControllerAdvice统一处理异常
https://blog.csdn.net/zzzgd_666/article/details/81544098(copy) 详细看此 所以结合上面我们可以知道,使用@ExceptionHandler ...
- fmt
fmt.Println("hello world") fmt.Printf("%T",a)打印a 的类型 fmt.Printf("%v",a ...
- Cogs 1695. 梦游仙境(分块)
梦游仙境 ★☆ 输入文件:XTTMYXJ.in 输出文件:XTTMYXJ.out 简单对比 时间限制:5 s 内存限制:512 MB [题目描述] 在Asm.def仍然在与人工智能进行艰苦的斗争时,雪 ...
- 查询Linux下文件格式.
备忘 file 命令可以查一个文件的格式 readelf -h 可执行文件名. 可以查询可执行文件的详细的格式 向Windows中exeinfo 软件类
- 页面的beforeunload和unload的事件应用
博主最近遇到一个需求,需要在用户离开之前给一个提示,是否确认离开,并且用户确认离开的话,需要发出一个请求 下面直接上代码: <!DOCTYPE HTML> <html> < ...