反序列化(利用字段参数进行数据验证)
反序列化(利用字段参数进行数据验证)
4.1 序列化器#
class Student1Serializer1(serializers.Serializer):
"""学生信息序列化器"""
# 1.转换的字段说明
# 字段 = serializer.字段类型(选项=选项值)
id = serializers.IntegerField(read_only=True) # 反序列化阶段不会要求id有值
name = serializers.CharField(required=True) # 反序列化阶段必填
sex = serializers.CharField(default="男") # 反序列化阶段如果没填,则使用默认值
age = serializers.IntegerField(min_value=0,max_value=100,error_messages={
"min_value":"the age must be age>=100",
"max_value":"the age must be age<=100"
}) # error_messages为自定义的错误信息,其实默认的有,也可以不写
classroom = serializers.CharField(default="310") # 反序列化阶段如果没填,则使用默认值
info = serializers.CharField(allow_null=True,allow_blank=True) # 允许客户端不填写(None),或者为""
# 2.如果当前序列化器继承的是Modelserializer,则需要声明需要调用的模型信息
# class Meta:
# model = 模型名
# fields = ["数据库字段名1","数据库字段名2","数据库字段名3",....,"数据库字段名n",] 或 "__all__"
# 3.验证代码的对象方法(钩子函数)
# def validate(self, attrs): # validate是固定的
# pass
# return attrs
#
# def validate_<字段名>(self,data): # 方法名必须以validate_<字段名>来命名
# psss
# return data
# 4.模型操作方法
# def create(self, validated_data): # 添加数据后,字典自动变为模型对象
# pass
#
# def update(self, instance, validated_data): # 更新数据后,字典自动变为模型对象
# pass
4.2 视图#
import json
from django.views import View
from django.http import JsonResponse
from .serializers import Student1Serializer, Student1Serializer1
from app.models import *
class StudentView(View):
def get3(self, request):
"""反序列化-采用字段选项来验证数据-验证失败不抛出异常"""
# 1.接收客户端提交的数据
# data = json.loads(request.body)
data = {
"name": "彭于晏",
"age": 120,
"sex": "男",
"classroom": "444",
"info": "要做个猛男,要猛!"
}
# 2.实例化序列化器,获取序列化对象
serializer = Student1Serializer1(data=data)
# 3.调用序列化器进行数据验证
ret = serializer.is_valid()
# 4.获取验证以后的结果
if ret:
return JsonResponse(dict(serializer.validated_data), safe=False)
else:
return JsonResponse(dict(serializer.errors), safe=False)
# 5.操作数据库
# 6.返回结果
def get(self, request):
"""反序列化-采用字段选项来验证数据-验证失败抛出异常"""
# 1.接收客户端提交的数据
# data = json.loads(request.body)
data = {
"name": "张家祥",
"age": 120,
"sex": "男",
"classroom": "444",
"info": "这个人很胖"
}
# 2.实例化序列化器,获取序列化对象
serializer = Student1Serializer1(data=data)
# 3.调用序列化器进行数据验证
ret = serializer.is_valid(raise_exception=True) # 抛出异常,代码不会往下执行
# 4.获取验证以后的结果
if ret:
return JsonResponse(dict(serializer.validated_data), safe=False)
else:
return JsonResponse(dict(serializer.errors), safe=False)
# 5.操作数据库
# 6.返回结果
4.3 测试#
验证失败不抛异常:
客户端数据:
{
"name": "彭于晏",
"age": 120,
"sex": "男",
"classroom": "444",
"info": "要做个猛男,要猛!"
}
响应结果:
{
"age": [
"the age must be age<=100"
]
}
验证失败抛异常:
客户端数据:
{
"name": "彭于晏",
"age": 120,
"sex": "男",
"classroom": "444",
"info": "要做个猛男,要猛!"
}
响应结果:
验证成功:
客户端数据:
{
"name": "彭于晏",
"age": 30,
"sex": "男",
"classroom": "444",
"info": "要做个猛男,要猛!"
}
响应结果:
{
"name": "彭于晏",
"sex": "男",
"age": 30,
"classroom": "444",
"info": "要做个猛男,要猛!"
}
作者:minqiliang
出处:https://www.cnblogs.com/minqiliang/p/16822113.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!