一 数据验证

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

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()TrueFalseerrorsREST frameworkNON_FIELD_KEYvalidated_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):
    

二 保存数据

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

instancecreated()update()instancesave()created()instancesave()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