Django rest framework ---Serializers

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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 






 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值