Serializers可以把复杂的数据结构例如querysets, 模型实例转化为python的数据格式。
from datetime import datetime
class Comment(object):
def __init__(self, email, content, created):
self.email = email
self.content = content
self.created = created
comment = Comment('admin@163.com', 'test rest framework', '2016-08-15 14:20:00')
创建一个serializer类:
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharFIeld(max_length=128)
created = serializers.DateTimeField()
创建一个serializer对象
serializer = CommentSerializer(comment)
serializer.data # dict
我们可以把它装换成json
from rest_framework.renders import JSONRenderer
content = JSONRenderer().render(serializer.data) #json
反序列化:
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
stream = BytesIO(content)
data = JSONParser().parse(stream)
serializer = CommentSerializer(data=data)
serializer.is_valid()
serializer.validated_data
------------------------------------------------------------------------------------------------
保存实例
如果我们想返回基于有效数据的对象实例,我们需要重写create 或者 update方法
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=128)
created = serializers.DateTimeField()
def create(self, validate_data):
return Comment(**validate_data)
def update(self, instance, validate_data):
instance.email = validata_data.get('emial', instance.email)
instance.content = validata_data.get('content', instance.content)
instance.created = validate_data.get('created', instancle.created)
return instance
如果Comment是django的模型,你可以这样做把数据保存到数据库中
from rest_framework import serializers
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=128)
created = serializers.DateTimeField()
def create(self, validate_data):
return Comment.objects.create(**validate_data)
def update(self, instance, validate_data):
instance.email = validata_data.get('emial', instance.email)
instance.content = validata_data.get('content', instance.content)
instance.created = validate_data.get('created', instancle.created)
instance.save()
return instance
我们可以调用.save方法,返回一个对象实例
comment = serializer.save()
.save()方法要么是创建一个新的实例,要么是更新一个已经存在的实例,这取决于你给它传的值
serializer = CommentSerializer(data=data)
# 创建一个新的实例
serializer = CommentSerializer(comment, data=data)
# 更新comment
.save() 传递额外的参数(传递关键字参数)
serializer.save(owner=request.user)
当调用create or update方法时,关键字参数会被包含在validate_data中
---------------------------------------------------------------------------------
有效性
在序列化数据之前,你需要调用is_valid()方法,如果有效性出错,你可以在.errors属性中查询错误信息
serializer = CommentSerializer(data={'email': 'as@163.com', 'content': ' python code'})
serializer.is_valid()
serializer.errors
验证字段的有效性
如果你想验证一个字段的有效性,可以在Serializer的子类中实现 validate_<field_name>方法
from rest_framework import serializers
class BlogPostSerializer(serializers.Serializer):
title = serializers.CharField(max_length=128)
content = serializers.CharField()
def validate_title(self, value):
if 'django' is not in value.lower():
raise serializers.ValidationError(' blog not about django')
return value
Note: 如果你的field_name在serializer中声明为require=False, 而你又没有声明validate_<field_name>方法,那么在validation过程中是不会检查这个字段的
-----------------------------------------------------------------------------------
部分更新
一般来说,你需要把所有require=True的所有字段都更新,但是你可以通过指定partial参数来实现部分更新
comment = CommentSerializer(data={'content': 'python code'}, partial=True)