Django restframework序列化

百般思念 提交于 2019-11-30 23:00:58

django-rest-framework-tutorial-cn(DRF中文教程,以下摘要需要注意的部分,便于理解回顾)

https://whatwewant.gitbooks.io/django-rest-framework-tutorial-cn/content/1.Serialization.html

创建一个 Model

class Snippet(models.Model):
    ...

参看教程(略)

创建一个序列化类(Serializer class)

DRF的序列化的类类似于的Django的表单类,Django的表单类是用于沟通django的Model和网页的form之间的桥梁; 而序列化类是哟哦那个与沟通Django的Model类和JSON数据格式之间的桥梁。 对model实力序列化/反序列化成表述,这里用json。

SnippetSerializer(serializers.Serializer
):
    ...
    # 定义如何通过反序列化数据生成正确的对象实例
    def restore_object():
        pass

使用序列化工作

创建snippets实例:

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code = 'print "hello, world"\n')
snippet.save()

现在有了snippet实例,接下来将其中一个实例序列化。

Model ——> Serializer

生成Python原生数据

serializer = SnippetSerializer(snippet)
serializer.data
# 现在我们已经将模型实例(model instance)转化成Python原生数据类型。
# data挂在的是Python的dict字典的值
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}

Serializer ——>JSON

将数据转换成json格式,完成序列化

content = JSONRender().render(serialilzer.data)
content
# 已经转换成JSON格式
# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'

这个就可以直接诶送入api进行传输了。 类似于json.dumps

json.dumps(serializer.data).encode('utf-8')

反序列化

stream——>Python

将输入流(content),转换成Python原生数据类型

stream = BytesIO(content)
data = JSONPaser().parse(stream)

将字节流变成Python的dict (json.loads)

json.loads(content.decode('utf-8'))=serializer.data
(True)
Python——>serializer对象(models instance?)

将Python原生数据类型,转换成对象实例

serializer = SnippetSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# OrderedDict([('title', ''), ('code', 'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])
serializer.save()
# <Snippet: Snippet object>
可以序列化模型实例(model instance),也可以序列化查询集(querysets),需要添加参数 many=True。
serializer = SnippetSerializer(Snippet.objects.all(), many=True)
serializer.data
# [OrderedDict([('pk', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('pk', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('pk', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!