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中再介紹。