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='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数据成员。
而且在调用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中再介绍。