django rest-framework之Serializers

Serializers類的作用就是將對(duì)象序列化成python可以直接獲取的數(shù)據(jù),比如字典,xml,或者將數(shù)據(jù)直接轉(zhuǎn)換成python對(duì)象。
這與Serializers初始化的時(shí)候傳入的參數(shù)有關(guān)系,Serializers繼承自BaseSerializer,它的init函數(shù)如下:

    def __init__(self, instance=None, data=empty, **kwargs):
        self.instance = instance
        if data is not empty:
            self.initial_data = data
        self.partial = kwargs.pop('partial', False)
        self._context = kwargs.pop('context', {})
        kwargs.pop('many', None)
        super(BaseSerializer, self).__init__(**kwargs)

通常一個(gè)Serializers類的數(shù)據(jù)成員和另外一個(gè)類(在django中通常是model類)的數(shù)據(jù)成員一一對(duì)應(yīng)的,或者Serializers的數(shù)據(jù)成員要覆蓋對(duì)應(yīng)的另外一個(gè)類,比如:

from datetime import datetime
from rest_framework import serializers

class Comment(object):
    def __init__(self, email, content, created=None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()

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

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

從上面的例子我們就可以清晰的看到,他們Comment和CommentSerializer都有email,content,created數(shù)據(jù)成員。
而且在調(diào)用CommentSerializer類時(shí),傳入的是Comment的instance,即comment 對(duì)象,對(duì)于這種情況,在django中常見(jiàn)的就是去數(shù)據(jù)庫(kù)中查詢,然后返回一個(gè)model對(duì)象,然后將這個(gè)model對(duì)象當(dāng)做參數(shù)傳遞給model對(duì)應(yīng)的序列化類,從而獲取model中的數(shù)據(jù),這里面主要就會(huì)調(diào)用CommentSerializer.data方法

另外一種使用方式就是通過(guò)其他手段獲取到一定的數(shù)據(jù),然后將數(shù)據(jù)初始化成另外一個(gè)對(duì)象。在django中常見(jiàn)的就是就是一個(gè)http請(qǐng)求過(guò)來(lái),從body中獲取數(shù)據(jù),然后處理數(shù)據(jù),然后將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,如下面的例子:

class TestView(APIView):
    authentication_classes = (
        BasicAuthentication,
    )
    permission_classes = (
        IsAdminUser,
    )
    def post(self, request):
        data=request.data
        # do something with data
        serializer = PostProjectSerializer(data)
        if not serializer.is_valid(): #驗(yàn)證數(shù)據(jù)的合法性
            # do some thing
        else: 
             serializer.save() # save會(huì)調(diào)用PostProjectSerializer的create函數(shù),所以要存儲(chǔ)到數(shù)據(jù)庫(kù),還要依賴PostProjectSerializer的create函數(shù)的實(shí)現(xiàn)

以上這就是Serializers在django中常用的兩種方式,關(guān)于APIView,在后續(xù)的rest-framework中再介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容