1 Serializers
1 简介
序列化器允许将诸如queryset和模型实例之类的复杂数据转换为原生的Python数据类型,这些数据类型可以很容易地转换为JSON、XML或其他内容类型。序列化器还提供反序列化,允许解析后的数据在第一次验证传入数据之后被转换回复杂类型。
REST框架中的序列化器与Django的表单和模型类的工作非常相似。框架提供了一个Serializer类,使用一种强大的、通用的方法来控制响应的输出,和一个ModelSerializer类,它为创建处理模型实例和queryset的序列化器提供了一个有用的快捷方式。
2 使用示例
1.创建一个对象
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='[email protected]', content='foo bar')
2. 声明一个serializer类,提供序列化和反序列化方法
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
3. 序列化对象(转化为python的原生数据类型,再转化为其他格式)
serializer = CommentSerializer(comment)
serializer.data
# {'email': '[email protected]', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
# 装换成json数据类型
from rest_framework.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data)
json
# b'{"email":"[email protected]","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'
4. 反序列化对象(首先将数据流转化为python原生数据)
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
# 转化成数据流
stream = BytesIO(json)
# 使用json解析器转化成python原生数据类型,从字符串中解析出json对象
data = JSONParser().parse(stream)
# 将这些原生数据恢复到验证字典中
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': '[email protected]', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
5. 保存实例
如果我们想返回一个完整的对爱实例,那么我们必须基于validated data实现一个.create()或update()方法,或者两个都实现
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
def create(self, validated_data):
return Comment(**validated_data)
def update(self, instance, validated_data):
instance.email = validated_data.get('email', instance.email)
instance.content = validated_data.get('content', instance.content)
instance.created = validated_data.get('created', instance.created)
return instance
如果对象与数据模型一致,也想保存对象到数据库模型中:
def create(self, validated_data):
# 使用数据库模型对象进行创建
return Comment.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.email = validated_data.get('email', instance.email)
instance.content = validated_data.get('content', instance.content)
instance.created = validated_data.get('created', instance.created)
instance.save()
return instance
最后我们对通过验证的对象进行保存
comment = serializer.save()
.save()方法到底是更新还是创建,取决于我们是否传入一个已经存在的序列化实例,如:
# .save()将会创建一个新的实例
serializer = CommentSerializer(data=data)
# .save()将会更新已经存在的comment实例
serializer = CommentSerializer(comment, data=data)
保存时添加附加属性
有时,您希望您的视图代码能够在保存实例的时候注入额外的数据。这些额外的数据可能包括当前用户、当前时间或其他不属于请求数据的信息。
serializer.save(owner=request.user)
添加的附加信息也会被包含在validated_data中,然后传入到.create()或update()函数中去
重写保存方法
有时created()和update()方法名字命名不能传达出实际意义,就需要重写,如下, 你应该重写方法:
class ContactForm