通知短信+运营短信,5秒速达,支持群发助手一键发送🚀高效触达和通知客户 广告
## 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)} ~~~