📌  相关文章
📜  创建和使用序列化器——Django REST 框架

📅  最后修改于: 2022-05-13 01:55:33.442000             🧑  作者: Mango

创建和使用序列化器——Django REST 框架

在 Django REST Framework 中,序列化的概念是将 DB 数据转换为 javascript 可以使用的数据类型。序列化器允许将复杂数据(例如查询集和模型实例)转换为原生Python数据类型,然后可以轻松地将其呈现为 JSON、XML 或其他内容类型。序列化器还提供反序列化,允许在首先验证传入数据后将解析的数据转换回复杂类型。 REST 框架中的序列化程序的工作方式与 Django 的 Form 和 ModelForm 类非常相似。

创建一个基本的序列化器

要创建一个基本的序列化器,需要从 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

让我们检查输出,如果数据已被反序列化 -

反序列化休息框架