序列化检验
目的:减少原生Django在数据校验的繁琐,直接在子应用中新建serializers.py
封装序列化器
重写序列化器特定名称方法,针对特定名称方法来自定义校验。
要求:在自定义校验之前,需要前序的约束条件校验
和类型校验
,保证当前校验的值有效
(以图书类中的btitile字段为例)
需求1: 检验前端数据传过来的数据是一本是否关于Django的书
方法1:在序列化器类BookInfoSerializer(serializers.Serializer)
中重写check_btitile(value)
方法
# value 是btitle字段经过前序校验的值
def check_btitile(value):
# 判断django字符 是否出现在 btitle 字段的值中
if "django" not in value:
# 如果不在,则校验失败,抛出异常
raise serializers.ValidationErroe("这不是一本关于django的书")
需求2: 检验前端数据传过来的数据是一本是否关于Django的书
方法2:在序列化器类BookInfoSerializer(serializers.Serializer)
中重写validate_<被校验字段名>(self,value)
方法
def validate_btitle(self,value):
# value:btitle 字段经过前序校验的值
# return: 经过当前校验的当前字段的值
if "django" not in value:
raise serializers.ValidationError("这不是一本关于django的书")
return raise
# 一定要返回字段的有效值,如果不返回会造成当前字段的数据丢失
需求3:全字段检验
方法3:在序列化器类BookInfoSerializer(serializers.Serializer)
中重写validate(self,arrts)
方法
def validate(self,attrs):
# attrs:当前校验所有字段及其值
# return:返回的最终的有效数据 就是Validated_data
btitle =attrs.get("btitile")
if "django" not in btitle:
raise serializer.ValidationError("这不是一本关于django的书")
return attrs
# attrs 最终有效数据 如果不返回就会丢失最终有效数据