django rest-framework之Serializers

Serializers类的作用就是将对象序列化成python可以直接获取的数据,比如字典,xml,或者将数据直接转换成python对象。
这与Serializers初始化的时候传入的参数有关系,Serializers继承自BaseSerializer,它的init函数如下:

    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)

通常一个Serializers类的数据成员和另外一个类(在django中通常是model类)的数据成员一一对应的,或者Serializers的数据成员要覆盖对应的另外一个类,比如:

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='[email protected]', content='foo bar')
serializer = CommentSerializer(comment)
serializer.data
# {'email': '[email protected]', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}

从上面的例子我们就可以清晰的看到,他们Comment和CommentSerializer都有email,content,created数据成员。
而且在调用CommentSerializer类时,传入的是Comment的instance,即comment 对象,对于这种情况,在django中常见的就是去数据库中查询,然后返回一个model对象,然后将这个model对象当做参数传递给model对应的序列化类,从而获取model中的数据,这里面主要就会调用CommentSerializer.data方法

另外一种使用方式就是通过其他手段获取到一定的数据,然后将数据初始化成另外一个对象。在django中常见的就是就是一个http请求过来,从body中获取数据,然后处理数据,然后将数据存储到数据库中,如下面的例子:

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(): #验证数据的合法性
            # do some thing
        else: 
             serializer.save() # save会调用PostProjectSerializer的create函数,所以要存储到数据库,还要依赖PostProjectSerializer的create函数的实现

以上这就是Serializers在django中常用的两种方式,关于APIView,在后续的rest-framework中再介绍。

你可能感兴趣的:(django rest-framework之Serializers)