Django1.11序列化与反序列化
django序列化与反序列化
from rest_framwork import serializers
serializers.ModelSerializer
模型类序列化器,必须依据模型类创建序列化器
- 基于模型类自动生成一系列字段
包含默认的 crate()和update()
定义ModelSerializer类
定义序列化器
- class BookInfoSerializer(serializer.ModelSerializer):
class Meta:
model = BookInfo
filels = 'all'
read_only_fields = ('id', 'readcount', 'commentcount')
extra_kwargs = {
'readcount': {'min_value': 0, 'required': True},
'commentcount': {'max_value': 0, 'required': True},
}- model,指明参照的那个模型类
- fields ,指明为模型类的那些字段生成
- fields = ‘all’表示所有字段
- exclude = ('iamge',) 表示排除哪些字段
- fields = ('id','name','readcount') 表示显示哪些字段
- read_only_fields指明只读字段,即仅用于序列化输出的字段
- extra_kwargs,为ModelSerializer添加或修改原有的选型参数
extra_kwargs = {
'readcount': {'min_value': 0, 'required': True},
'commentcount': {'max_value': 0, 'required': True},
}serailizers.Serializer
即可以为数据库模型类定义,也可以为非数据库模型类的数据定义
定义Serializer类
定义序列化器
- class BookInfoSerializer(serializers.Serializers)
id = serializers.IntegerField(label='ID', read_only=True) 字段和选选项
创建Serializer对象
- s = BookInfoSerializer(instance=None, data=empty, **kwarg)
instance:使用数据库对象赋值,用于序列化
data:字典类型数据,用于反序列化序列化
- 将程序中的数据结构类型转换为其他类型(字典,JSON,XML)Django中将模型类转化为JSON
- 基本使用
- 获取需要序列化的对象
- from book.models import BookInfo
book = BookInfo.objects.get(id=4)- books = BookInfo.objects.all()
- from book.models import BookInfo
- 构造序列化器对象
- from book.serializers import BookInfoSerializer
serializer = BookInfoSerializer(instance=book)- serializer = BookInfoSerializer(instace=books, many=True)
- from book.serializers import BookInfoSerializer
- 获取序列化数据
- serializer.data
- 获取需要序列化的对象
- 关联对象嵌套序列化
- 如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明
- 关联的对象数据是一个
- PrimaryKeyRelatedFiled
- class PeopleInfoSerializer(serializers.Serializer):
#book = serializers.PrimaryKeyRelatedFiled(label='图书',read_only=True)
book = serializers.PrimaryKeyRelatedFiled(label='图书',queryset=BookInfo.objects.all())- 包含read_only=True时,该字段不能用于反序列化使用
- 包含queryset参数时,将被用作反序列化时参数校验使用
- 使用序列化器对象的data方法时
对应字段显示的是本表数据- {'id': 10, 'book': 3, 'description': '独孤九剑', 'gender': 1, 'name': '令狐冲'}
- class PeopleInfoSerializer(serializers.Serializer):
- StringRelatedFiledd
- 此字段被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
- book = serializers.StringRelatedFiled(label='图书')
- class BookInfoSerializer(serializers.serializer):
...
def str(self):
return self.name
- class BookInfoSerializer(serializers.serializer):
- 使用序列化器对象的data方法时
对应字段显示的关联表__str__方法返回的数据- {'description': '独孤九剑', 'name': '令狐冲', 'gender': 1, 'book': '笑傲江湖', 'id': 10}
- 使用关联对象的序列化器
- book = BookInfoSerializer()
- 使用序列化器对象的data方法时
对应字段显示的式OrderDict对象=有序字典- {'book': OrderedDict([('id', 3), ('name', '笑傲江湖'), ('pub_date', '1995-12-24'), ('readcount', 28), ('commentcount', ('image', None)]), 'gender': 1, 'name': '令狐冲', 'description': '独孤九剑', 'id': 10}
- PrimaryKeyRelatedFiled
- 关联对象的数据是多个
- many参数
- 使用django创建模型类的时候,一对多的一表有peopleinfo_set隐藏字段
- 如果关联对象的数据不是只有一个,而是包含多个数据,如想序列化对应数据时,此时关联字段类型的指明仍使用上述方法,只是在声明关联字段时,多补充一个many=True参数即可
- class BookInfoSerializer(serializers.Serializer):
peopleinfo_set = serializers.PrimarykeyRelatedField(read_only=True,many=True)
- class BookInfoSerializer(serializers.Serializer):
from book.models import BookInfo
from book.serializers import BookInfoSerializer
book = BookInfo.objects.get(id=3)
serializer = BookInfoSerializer(book)
serializer.data
{'id': 3, 'peopleinfo_set': [10, 11, 12, 13], 'commentcount': 18, 'name': '笑傲江湖', 'readcount': 28, 'pub_date': '199-24', 'image': None}反序列化
- 与序列化相反,Django中将JSOn字符串转化为Django中的模型类对象
- 验证数据
from book.serializers import BookInfoSerializer
data = {'pub_date':123}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()
False
serializer.errors
{'pub_date': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')], 'name': [ErrorDetail(string='This field is required.', code='required')]}
serializer.validated_data
{}- 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取
验证成功的数据或保存成模型类对象 - 序列化器对象调用is_valid()
- 通过字段类型和选型验证,验证成功返回True,失败返回False
- is_valid(raise_exception=True)
- 验证失败后抛出serializers.ValidationError
- 向前端返回HTTP 400 Bad Request响应
- 自定义验证方法
- validate_
- 在序列化器中定义固定方法,验证单一字段
- class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增
def validate_readcount(self,value):
if value < 0:
raise serializers.ValidationError('阅读数量不能为负数')
return value
- class BookInfoSerializer(serializers.Serializer):
- 在序列化器中定义固定方法,验证单一字段
- validate
- 在序列化器中定义固定方法,验证多个字段
- class BookInfoSerializer(serializers.Serializer):
id = serializers.IntegerFiled(label='ID',read_only=True)
readcount = serializers..IntegerFiled(label='阅读量',required=False)
commentcount = serializers..IntegerFiled(label='评论量',required=False)
def validate(self,attrs):
readcount = attrs.get('readcount')
commentcount = attrs['commentcount']
if commentcount > readcount:
raise serializers.ValidationError('评论量不能大于阅读量')
returen attrs
- class BookInfoSerializer(serializers.Serializer):
- 在序列化器中定义固定方法,验证多个字段
- validators
- 在字段中添加validators选项参数,补充验证行为
- class BookInfoSerializer(serializers.Serializer):
- 在字段中添加validators选项参数,补充验证行为
- validate_
def custom_validate(value):
raise serializers.ValidationError('我就是来捣乱的')"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='名称', max_length=20,validators=[custom_validate])
pub_date = serializers.DateField(label='发布日期', required=False)
readcount = serializers.IntegerField(label='阅读量', required=False)
commentcount = serializers.IntegerField(label='评论量', required=False)
image = serializers.ImageField(label='图片', required=False)
peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增- 序列化器对象调用errors
- 验证失败获取错误信息
- 验证成功,获取错误信息
- 序列化器调用validated_data
- 验证成功获取数据
- 保存
- 如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现。
- class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='名称', max_length=20)
pub_date = serializers.DateField(label='发布日期', required=False)
readcount = serializers.IntegerField(label='阅读量', required=False)
commentcount = serializers.IntegerField(label='评论量', required=False)
image = serializers.ImageField(label='图片', required=False)
peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增def create(self, validated_data):
"""新建"""
return BookInfo(**validated_data)def update(self, instance, validated_data):
"""更新,instance为要更新的对象实例"""
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)
return instance- 如果需要在返回数据对象的时候,也将数据保存到数据库中,则可以进行如下修改
- class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='名称', max_length=20)
pub_date = serializers.DateField(label='发布日期', required=False)
readcount = serializers.IntegerField(label='阅读量', required=False)
commentcount = serializers.IntegerField(label='评论量', required=False)
image = serializers.ImageField(label='图片', required=False)
peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增def create(self, validated_data):
"""新建"""
return BookInfo.objects.create(**validated_data)def update(self, instance, validated_data):
"""更新,instance为要更新的对象实例"""
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()
return instance- 实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法返回一个数据对象实例了
- serializer.save()
- 如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。
- 如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现。
XMind: ZEN - Trial Version
Django1.11序列化与反序列化的更多相关文章
- Django1.11 的serializers序列化model
开发环境:Django1.11 Python3 如果想把很多model转化成json格式可以直接这样写: from django.views.generic.base import View fro ...
- DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)
media资源路径设置 (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ...
- ModelSerializer,序列化与反序列化整合
复习 """ 1.解析模块:全局局部配置 REST_FRAMEWORK = { # 全局解析类配置 'DEFAULT_PARSER_CLASSES': [ 'rest_f ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- 序列化,反序列化和transient关键字
一.序列化和反序列化的概念 序列化:指把java对象转换为字节序列的过程. 反序列化:指把字节序列恢复为java对象的过程. 对象的序列化主要有两种用途: 1) 把对象的字节序列保存到硬盘上,通常存放 ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
随机推荐
- 初学Java(1)
1.Java基本数据类型: 2.Java的main方法: 被static修饰,类名与文件名相同:void:方法的返回值,无返回值:main方法是程序的入口,有且只有一个: String[] args: ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Map接口使用的注意事项
import java.util.HashMap ; import java.util.Map ; import java.util.Set ; import java.util.Iterator ; ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-play-circle
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- H5页面,百度地图点击事件
需求:用户点击地图的时候获取地址街道,编码等详细信息. 然后看百度API文档,看到了click事件,关键时候还是需要看文档的. 实现 这样子虽然在浏览器的手机模拟器下是没有问题的 但是放在机器上测试的 ...
- Redis数据类型及其操作
redis数据类型即操作 1. 字符串 set 设置字符串 格式: set key value 例子: set name kainhuck get 获取字符串的值 格式: get key 例子: ge ...
- 操作数据库的SqlHelper类
public static class SqlHelper { public static readonly string connstr = ConfigurationManager.Connect ...
- 145-PHP 使用<<<和HTML混编(一)
<?php $html=<<<TEMP1 <title>PHP输出HTML代码</title> <body> <a href=#> ...
- 096-PHP循环使用next取数组元素
<?php function return_item($arr,$num=0){ //定义函数 for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr ...
- gem5-gpu全系统模式
# 注意:安装好gem5-gpu后再配置全系统环境 # 下载全系统模拟需要的工具,详见http://gem5.org/Running_gem5#Full_System_.28FS.29_Mode,将L ...
- SciKit-Learn 可视化数据:主成分分析(PCA)
## 保留版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Le ...