Django Restful Framework (一): Serializer


  Serializer 允許復雜數據(比如 querysets 和 model 實例)轉換成python數據類型,然后可以更容易的轉換成 json 或 xml 等。同時,Serializer也提供了反序列化功能,允許解析數據轉換成復雜數據類型。

聲明 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 

from rest_framework import serializers

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

序列化對象

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

這時我們已經轉換model 實例成了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"}'

反序列化對象

反序列化就是將json或xml等格式轉換成復雜數據類型

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)}

驗證

反序列化數據的時候,在訪問有效數據或保存對象實例之前,你應該總是調用 is_valid() ,以查看是否反序列化成功,如果有錯誤, .errors 屬性包含錯誤信息。

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})
serializer.is_valid()
# False
serializer.errors
# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']}

保存實例

如果你希望返回基於驗證數據(validated data,也就是反序列化后的數據)的完整的對象實例,你需要實現.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

現在,當你反序列化數據時,你需要調用.save() 方法返回對象實例,基於驗證的數據(validated data)

comment = serializer.save()

調用save() 時,要么創建一個新實例,要么更新一個已存在的實例,這取決於你是否傳入了實例參數

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM