## Serializer
rest包提供的一个极其强大实用的类族,本身并没有基于Django的core模块中的序列器进行拓展,现在还没有用过Django原生的serializer,但是仅从使用rest的这一个类族的体验来看,它是非常有用的工具,个人认为它的优点也是最强大的功能在三处:
~~~txt
1. 对Django的数据模型序列化之后返回的是一个类字典的数据结构returndict(实际上也就是基于Python的ordereddict构造的),这种数据
结构对前端非常友好,因为这实际上基本就是JSON数据类型了
2. 实例化的序列器可以对传入的数据模型实例直接进行数据库操作(这个存疑)
3. Serializer类族不是一个专门为Django数据模型服务的序列器,它还可以对其他任何Python类实例进行序列化
~~~
这里将REST官网的一个序列和反序列的例子拿来解释下
~~~py
from datetime import datetime
class Comment(object):
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()
comment = Comment(email='leila@example.com', content='foo bar')
~~~
上面是一个很普通的类Comment,它和Django没有任何关系可以说,而REST里面的序列器类可以给这个类量身定做一个序列器,如下
~~~py
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
~~~
<br>
就像文档上自己说的,这里的CommentSerializer很像Django里面的表单类,不过它自己本身的便捷性也是很明显的
~~~py
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
~~~
直接利用这个序列器类套到comment实例上去,它的所有属性就已经被很好的字典化,或者说json化了
进一步json化也很容易
~~~py
from rest_framework.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'
~~~
如果需要反序列化也是相对简单的
~~~py
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
stream = BytesIO(json)
data = JSONParser().parse(stream)
~~~
上面的data已经可以直接注入序列器中了
~~~py
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
~~~
- Django基础
- 模型
- 外键
- Model Manager
- 过滤器函数
- 查询对象
- 字段的细节
- QuerySet的应用
- 视图
- Django类视图
- 权限控制
- Django进阶
- 中间件
- _meta组件
- 信号
- User模块
- prefetch_related和select_related的区别
- 较少被用到的查询对象
- Django的深层设计理念
- Declarative Syntax
- django的migration操作
- 较少用到的Queryset方法的一些坑
- Django配置
- Django环境配置变量
- Django源码阅读
- ORM
- QuerySet源码
- Query源码
- Q&F
- Model和Manager的详解
- Http请求响应
- HttpRequest
- 自建数据结构
- Django开发辅助工具
- Django-rest-framework
- Serializer
- 异步任务调度器Celery
- 数据库补充
- 定义
- 字段
- 事务
- 视图
- 函数
- 联结
- 窗口函数
- GROUPING运算符
- HAVING谓词
- django_bulk_update
- django_bulk_update源码分析
- 项目小功能开发
- Django的一些小细节