反序列化(添加和更新)
6.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"
})
classroom = serializers.CharField(default="310",validators=[check_classroom]) # 反序列化阶段如果没填,则使用默认值
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是固定的
"""
验证来自客户端的所有数据
:param: attrs 序列化器实例化时,传入的data
这个方法经常用于密码和确认密码的校验,因为需要多个字段的数据
"""
# 310教室只有女生,不能有男生
if attrs["classroom"]=="310" and attrs["sex"] == "男":
raise serializers.ValidationError("310教室不能有男生,只能有小姐姐。")
return attrs
def validate_name(self, data): # 方法名必须以validate_<字段名>来命名
"""
验证单个字段
该方法会自动被is_valid()调用
"""
if data in ["python","django"]:
raise serializers.ValidationError("学生姓名不能是python或django")
# 验证成功必须返回data
return data
# 4.模型操作方法
def create(self, validated_data): # 添加数据后,字典自动变为模型对象
"""
添加数据,validated_data就是验证成功后的结果
"""
student = studentsInfo.objects.create(**validated_data)
return student
视图
class StudentView(View):
def get(self, request):
"""反序列化-采用字段选项来验证数据-验证失败抛出异常"""
# 1.接收客户端提交的数据
# data = json.loads(request.body)
data = {
"name": "彭于晏",
"age": 30,
"sex": "男",
"classroom": "666",
"info": "要做个猛男,要猛!"
}
# 2.实例化序列化器,获取序列化对象
serializer = Student1Serializer1(data=data)
# 3.调用序列化器进行数据验证
serializer.is_valid(raise_exception=True) # 抛出异常,代码不会往下执
# 4.获取验证以后的结果,操作数据库
serializer.save() # 如果在实例化序列化器对象的时候没有传入instance属性,则自动调用序列化器的create钩子函数方法
# 5.返回结果
return JsonResponse(serializer.data,status=201)
响应结果
{
"id": 15,
"name": "彭于晏",
"sex": "男",
"age": 30,
"classroom": "666",
"info": "要做个猛男,要猛!"
}
数据库变化
6.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"
})
classroom = serializers.CharField(default="310",validators=[check_classroom]) # 反序列化阶段如果没填,则使用默认值
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是固定的
"""
验证来自客户端的所有数据
:param: attrs 序列化器实例化时,传入的data
这个方法经常用于密码和确认密码的校验,因为需要多个字段的数据
"""
# 310教室只有女生,不能有男生
if attrs["classroom"]=="310" and attrs["sex"] == "男":
raise serializers.ValidationError("310教室不能有男生,只能有小姐姐。")
return attrs
def validate_name(self, data): # 方法名必须以validate_<字段名>来命名
"""
验证单个字段
该方法会自动被is_valid()调用
"""
if data in ["python","django"]:
raise serializers.ValidationError("学生姓名不能是python或django")
# 验证成功必须返回data
return data
# 4.模型操作方法
def create(self, validated_data): # 添加数据后,字典自动变为模型对象
"""
添加数据,validated_data就是验证成功后的结果
"""
student = studentsInfo.objects.create(**validated_data)
return student
def update(self, instance, validated_data): # 更新数据后,字典自动变为模型对象
"""更新数据后,字典自动变为模型对象"""
instance.name = validated_data["name"]
instance.sex = validated_data["sex"]
instance.age = validated_data["age"]
instance.classroom = validated_data["classroom"]
instance.info = validated_data["info"]
return instance
视图
class StudentView(View):
def get4(self, request):
"""反序列化-采用字段选项来验证数据-验证失败抛出异常"""
# 1.接收客户端提交的数据
# data = json.loads(request.body)
pk = 15
try:
student = studentsInfo.objects.get(id=pk)
except studentsInfo.DoesNotExist:
return JsonResponse({"errors":"当前学生不存在"},status=400)
data = {
"name": "李坤城",
"age": 100,
"sex": "女",
"classroom": "000",
"info": "要做个猛男,要猛!"
}
# 2.实例化序列化器,获取序列化对象
serializer = Student1Serializer1(instance=student,data=data)
# 3.调用序列化器进行数据验证
serializer.is_valid(raise_exception=True) # 抛出异常,代码不会往下执
# 4.获取验证以后的结果,操作数据库
serializer.save() # 如果在实例化序列化器对象的时候没有传入instance属性,则自动调用序列化器的create钩子函数方法
# 5.返回结果
return JsonResponse(serializer.data, status=201)
响应结果
{
"id": 15,
"name": "李坤城",
"sex": "女",
"age": 100,
"classroom": "000",
"info": "要做个猛男,要猛!"
}
数据库变化
[](
标签:validated,serializers,age,更新,instance,添加,序列化,data From: https://www.cnblogs.com/minqiliang/p/16822135.html