欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django serializer(一)

程序员文章站 2022-07-02 14:35:41
Serializer 允许复杂数据(比如 querysets 和 model 实例)转换成python数据类型,然后可以更容易的转换成 json 或 xml 等。同时,Serializer也提供了反序列化功能,允许解析数据转换成复杂数据类型。 声明 Serializers 我们来创建一个简单对象作为 ......

serializer 允许复杂数据(比如 querysets 和 model 实例)转换成python数据类型,然后可以更容易的转换成 json 或 xml 等。同时,serializer也提供了反序列化功能,允许解析数据转换成复杂数据类型。

声明 serializers

我们来创建一个简单对象作为例子:

django serializer(一)
from datetime import datetime

class comment(object):
    def __init__(self, email, content, created=none):
        self.email = email
        self.content = content
        self.created = created or datetime.now()

comment = comment(email='leila@example.com', content='foo bar')
django serializer(一)

然后我们声明一个serializer 

django serializer(一)
from rest_framework import serializers

class commentserializer(serializers.serializer):
    email = serializers.emailfield()
    content = serializers.charfield(max_length=200)
    created = serializers.datetimefield()
django serializer(一)

序列化对象

serializer = commentserializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27t15:17:10.375877'}

这时我们已经转换model 实例成了python 数据类型,接下来我们将它转换成json 格式

django serializer(一)
from rest_framework.renderers import jsonrenderer

json = jsonrenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27t15:17:10.375877"}'
django serializer(一)

反序列化对象

反序列化就是将json或xml等格式转换成复杂数据类型

django serializer(一)
serializer = commentserializer(data=data)
serializer.is_valid()
# true
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
django serializer(一)

验证

反序列化数据的时候,在访问有效数据或保存对象实例之前,你应该总是调用 is_valid() ,以查看是否反序列化成功,如果有错误, .errors 属性包含错误信息。

serializer = commentserializer(data={'email': 'foobar', 'content': 'baz'})
serializer.is_valid()
# false
serializer.errors
# {'email': [u'enter a valid e-mail address.'], 'created': [u'this field is required.']}

保存实例

如果你希望返回基于验证数据(validated data,也就是反序列化后的数据)的完整的对象实例,你需要实现.create() 或 .update() 方法。

django serializer(一)
class commentserializer(serializers.serializer):
    email = serializers.emailfield()
    content = serializers.charfield(max_length=200)
    created = serializers.datetimefield()

    def create(self, validated_data):
        return comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance
django serializer(一)

现在,当你反序列化数据时,你需要调用.save() 方法返回对象实例,基于验证的数据(validated data)

comment = serializer.save()

调用save() 时,要么创建一个新实例,要么更新一个已存在的实例,这取决于你是否传入了实例参数

# .save() will create a new instance.
serializer = commentserializer(data=data)

# .save() will update the existing `comment` instance.
serializer = commentserializer(comment, data=data)