创建和使用序列化器——Django REST 框架
在 Django REST Framework 中,序列化的概念是将 DB 数据转换为 javascript 可以使用的数据类型。序列化器允许将复杂数据(例如查询集和模型实例)转换为原生Python数据类型,然后可以轻松地将其呈现为 JSON、XML 或其他内容类型。序列化器还提供反序列化,允许在首先验证传入数据后将解析的数据转换回复杂类型。 REST 框架中的序列化程序的工作方式与 Django 的 Form 和 ModelForm 类非常相似。
To check how to setup Django RESt Framework and create a API visit – How to Create a basic API using Django Rest Framework ?
创建一个基本的序列化器
要创建一个基本的序列化器,需要从 rest_framework 导入序列化器类并为序列化器定义字段,就像在 Django 中创建表单或模型一样。
例子
Python3
# 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()
Python3
# 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')
Python3
# import JSON Renderer
from rest_framework.renderers import JSONRenderer
# convert data to JSON
json = JSONRenderer().render(serializer.data)
Python3
import io
from rest_framework.parsers import JSONParser
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
Python3
serializer = CommentSerializer(data = data)
serializer.is_valid()
# True
serializer.validated_data
通过这种方式,可以根据所需字段为任何特定实体或对象声明序列化程序。序列化器可用于序列化和反序列化数据。
使用 Serializer 序列化数据
现在可以使用 CommentSerializer 来序列化评论或评论列表。同样,使用 Serializer 类看起来很像使用 Form 类。让我们首先创建一个 Comment 类来创建一个可以被我们的序列化器理解的 comment 类型的对象。
Python3
# 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 格式。
Python3
# import JSON Renderer
from rest_framework.renderers import JSONRenderer
# convert data to JSON
json = JSONRenderer().render(serializer.data)
使用 Serializer 反序列化数据
反序列化类似于序列化。这意味着将数据从 JSON 格式转换为给定的数据类型。首先,我们将流解析为Python原生数据类型……(定义要反序列化的数据类型……)
首先我们需要将这个json数据转换回序列化器能够理解的数据进行反序列化,
Python3
import io
from rest_framework.parsers import JSONParser
stream = io.BytesIO(json)
data = JSONParser().parse(stream)
现在让我们将数据反序列化回其原始状态
Python3
serializer = CommentSerializer(data = data)
serializer.is_valid()
# True
serializer.validated_data
让我们检查输出,如果数据已被反序列化 -