一 数据验证
后端接收数据,使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据,再保存为模型类对象。
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
网友评论