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)
