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