美文网首页
Djangorestframework的反序列化

Djangorestframework的反序列化

作者: W11ng | 来源:发表于2019-07-25 15:11 被阅读0次

一 数据验证

后端接收数据,使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据,再保存为模型类对象。

1. 普通验证

定义序列化类,使用字段约束数据。

from rest_framework import serializers


class BookInfoSerializer(serializers.Serializer):
    """自定义书籍信息序列化器类"""
    id = serializers.IntegerField(label='ID', read_only=True)
    title = serializers.CharField(label='名称', max_length=20)
    pub_date = serializers.DateField(label='发布日期', required=False)
    read = serializers.IntegerField(label='阅读量', required=False)
    comment = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)

在python终端验证函数。

>>> import BookInfoSerializer
>>> data = {'pub_data': 123}
>>> serializer = BookInfoSerializer(data=data)  
>>> serializer.is_valid()  # 参数不符合要求,验证不通过,返回False
False
>>> serializer.errors  # 显示错误信息
{'btitle': [ErrorDetail(string='This field is required.', code='required')], 'bpub_date': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}
>>> serializer.validated_data  # 已通过认证的数据为空字典
{}

>>> data = {'title': 'python'}   # 符合字段要求的数据
>>> serializer = BookInfoSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.errors  # 没有错误信息
{}
>>> serializer.validated_data
OrderedDict([('btitle', 'python')])

在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False
验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,其包含了字段和字段的错误信息。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_KEY来控制错误字典中的键值名。
验证成功,可以通过序列化器对象的validated_data属性获取数据。
在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。

2. 单个字段验证 【validate_字段名】

使用validate_name对某个字段进行验证。

class BookInfoSerializer(serializers.Serializer):
    """图书信息序列化器"""
    # 对title字段信息验证
    def validate_title(self, value):
        if "django" not in value.lower():
            raise serializers.ValidationError("不是关于Django的书籍。")
        return value

验证函数

>>> import BookInfoSerializer
>>> data = {'btitle': 'python'}
>>> serializer = BookInfoSerializer(data=data)
>>> serializer.is_valid()
False   
>>> serializer.errors
{'btitle': [ErrorDetail(string='图书不是关于Django的', code='invalid')]}

2. 多个字段验证 【validate】

class BookInfoSerializer(serializers.Serializer):
    

二 保存数据

数据验证成功后,可以使用序列化器完成数据反序列化。这个过程可以把数据转成模型类队形。

用是否传instance实例区分是调用created()还是update()。没有传递instance参数,调用save()方法时created()被调用;传递了instance实例,调用save()方法时,update()被调用

class BookInfoSerializer(serializers.Serializer):
    """书籍信息序列化器"""
    # 省略了字段構建
    def create(self, validated_data):
        """保存新信息"""
        # 传入已验证数据,创建到BookInfo模型中
        return BookInfo(**validated_data)  # BookInfo为模型类

    def update(self, instance, validated_data):
        """更新旧信息"""
        instance.title = validated_data.get("title", instance.title)
        instance.pub_date = validated_data.get("pub_date", instance.pub_date)
        instance.read = validated_data.get("read", instance.read)
        instance.comment = validated_data.get("comment", instance.comment)
        instance.save()
        return instance

相关文章

网友评论

      本文标题:Djangorestframework的反序列化

      本文链接:https://www.haomeiwen.com/subject/mcofrctx.html