Django REST Framework API Guide 04

2021-07-11 17:08

阅读:835

标签:render   over   max   ted   初始化   转化   char   情况   code   

本节大纲

  1、serializers

 

 

 

1、Serializers

Serializers允许复杂的数据,像queryset和模型实例转换成源生的Python数据类型。从而可以更简单的被渲染成JSON,XML或其他内容类型。Serializers也提供了反序列化的功能,允许解析过的数据转化为复杂的类型,在即将到来的数据被验证完之后。

另外的一点就是REST framework跟Django的Form和ModelForm类很相似。这里也提供了2个类,SerializerModelSerializer这两个功能强大的类,用来创建序列化,处理模型实例和queryset。

 

Declaring Serializers

一开始,让我们创建一个简单对象作为例子。

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=leila@example.com, content=foo bar)

我们将申明一个serializer,它可以用来序列化和反序列化和Comment对象对应的数据。

申明一个serializer看起来跟申明一个form很像。

from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

 

Serializing objects

现在使用CommentSerializer来序列化comment或者comment列表。使用Serializer类,跟使用Form类一样。

serializer = CommentSerializer(comment)
serializer.data
# {‘email‘: ‘leila@example.com‘, ‘content‘: ‘foo bar‘, ‘created‘: ‘2016-01-27T15:17:10.375877‘}

此时,我们已经转换模型实例到Python的源生数据类型。在序列化进程的最后,将数据渲染成json.

from rest_framework.renderers import JSONRenderer

json = JSONRenderer().render(serializer.data)
json
# b‘{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}‘

 

Deserializing objects

反序列化也很类似。首先我们解析流到Python源生的数据类型。

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
# {‘content‘: ‘foo bar‘, ‘email‘: ‘leila@example.com‘, ‘created‘: datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}

如果想返回完整的基于验证过的数据的对象实例,需要执行.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

如果你的对象实例对应Django模型,你也想确保这些方法保存对象到数据库。如果Comment是一个Django的model,这些方法可能看起来像

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类的建立抛弃了。完全把它当作一个model。现在当我们要反序列化数据,调用.save()方法返回一个对象实例,基于验证的数据

comment = serializer.save()

调用.save()方法可能会创建一个新的实例,或者更新一个现有的实例,取决于当初始化serializer类时是否已经存在一个实例。

# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

.create()和.update()方法都是可选择的,无论你怎么选择,取决于serializer类的使用情况。

 

Passing additional attributes to .save()

有时你想要你的视图代码可以在保存实例的时候注入新的额外数据。这些额外的数据可能包含当前用户,当前时间或者其他不是request.data一部分的东西。

可以像这样操作

serializer.save(owner=request.user)

当调用.create()或.update()时,任何额外的关键字参数都将包含在validated_data参数中。

 

Overriding .save() directly

有时候现有的方法不能够满足需求,比如在保存数据的时候,需要发送一封邮件,提醒别人更新的内容

class ContactForm(serializers.Serializer):
    email = serializers.EmailField()
    message = serializers.CharField()

    def save(self):
        email = self.validated_data[email]
        message = self.validated_data[message]
        send_email(from=email, message=message)

注意,在这个示例里面,我们已经可以直接访问serializer的.validated_data了。在serializer执行过程中,是先验证后操作(更新,保存),从常理上想其实也是这样,跟Form一样。

 

Validation

 

Django REST Framework API Guide 04

标签:render   over   max   ted   初始化   转化   char   情况   code   

原文地址:https://www.cnblogs.com/wuzdandz/p/9631032.html


评论


亲,登录后才可以留言!