创建和使用序列化器 – Django REST框架
在Django REST框架中,序列化的概念是将DB数据转换为可被javascript使用的数据类型。序列化器允许复杂的数据,如querysets和模型实例,被转换为本地Python数据类型,然后可以很容易地呈现为JSON、XML或其他内容类型。序列化器还提供了反序列化,允许解析后的数据在首先验证了传入的数据后被转换回复杂类型。REST框架中的序列化器与Django的Form和ModelForm类的工作非常相似。
要检查如何设置Django RESt框架并创建一个API,请访问 – 如何使用Django Rest框架创建一个基本API?
创建一个基本的串行器
要创建一个基本的序列化器,需要从rest_framework导入序列化器类,并为序列化器定义字段,就像在Django中创建一个表单或模型一样。
示例
# import serializer from rest_framework
from rest_framework import serializers
# create a serializer
class CommentSerializer(serializers.Serializer):
# initialize fields
email = serializers.EmailField()
content = serializers.CharField(max_length = 200)
created = serializers.DateTimeField()
这样,人们可以根据所需字段为任何特定的实体或对象声明序列化器。序列化器可用于序列化和反序列化数据。
使用序列化器对数据进行序列化
现在我们可以使用CommentSerializer来序列化一个评论,或者评论的列表。同样,使用序列化器类看起来很像使用表单类。让我们先创建一个Comment类来创建一个可以被我们的序列化器理解的Comment类型的对象。
# import datetime object
from datetime import datetime
# create a class
class Comment(object):
def __init__(self, email, content, created = None):
self.email = email
self.content = content
self.created = created or datetime.now()
# create a object
comment = Comment(email ='leila@example.com', content ='foo bar')
现在我们的对象已经准备好了,让我们试着将这个注释对象序列化。运行下面的命令。
Python manage.py shell
现在运行以下代码
# import comment serializer
>>> from apis.serializers import CommentSerializer
# import datetime for date and time
>>> from datetime import datetime
# create a object
>>> class Comment(object):
... def __init__(self, email, content, created=None):
... self.email = email
... self.content = content
... self.created = created or datetime.now()
...
# create a comment object
>>> comment = Comment(email='leila@example.com', content='foo bar')
# serialize the data
>>> serializer = CommentSerializer(comment)
# print serialized data
>>> serializer.data
现在让我们检查一下这个的输出。
我们可以使用Python的内置函数或rest框架的解析器将这些数据转换成JSON或XML格式。
# import JSON Renderer
from rest_framework.renderers import JSONRenderer
# convert data to JSON
json = JSONRenderer().render(serializer.data)
使用序列化器来反序列化数据
反序列化与序列化类似。它意味着将数据从JSON格式转换为一个给定的数据类型。首先,我们把一个流解析成Python本地数据类型……(定义要反序列化的数据类型….)
首先,我们需要将这些json数据转换为可以被序列化器理解的数据,以便进行反序列化。
import io
from rest_framework.parsers import JSONParser
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
现在让我们把数据反序列化为原始状态
serializer = CommentSerializer(data = data)
serializer.is_valid()
# True
serializer.validated_data
让我们检查输出和数据是否已经被反序列化: