Serializer功能:
1、序列化:序列化器将模型对象转成字典,经过视图的respnose后转成json字符串
2、反序列化:视图中的request将客户端发过来的数据转成字典,序列化把字典转成模型
3、反序列化:对客户端发送过来的数据,完成数据校验
很重要,因为几乎每个接口都要用到。
一、定义序列化器
序列化器需要使用类定义,并且这个类必须直接或者简介继承rest_framework.serializers.Serializer
最常用的序列化器基类:
Serializer:所有序列化器的基类
ModelSerializer:模型类序列化器基类
from rest_framework import serializers
class StudentSerializer(serializers.Serializer):
# 1.需要转换的字段声明 提供给客户端的
id=serializers.IntegerField()
name=serializers.CharField()
sex=serializers.BooleanField()
# 2.声明调用的模型类(如果继承的是ModelSerializer,才需要声明)
class Mate:
model=模型
field="__all__"
field=["字段1","字段2",....]
# 3.验证方法
def validate(self,attrs):
'''
validate: 方法的格式必须是这个
attrs: 客户端传递的数据 字典格式
'''
pass
return attrs
def validate_<字段名>(self,data):
'''
validate: 方法的格式必须是这个
attrs: 客户端传递的数据 字典格式
'''
pass
return data
# 4.模型操作
def create(self,validate_data):添加数据操作,添加数据后,就自动实现了从字典变成模型对象的过程
pass
def update(self,validate_data):更新数据操作,更新数据后,就自动实现了从字典变成模型对象的过程
pass
注意: Serializer并不是只对数据库模型类的数据进行转换数据格式,也可以为非数据库模型类的数据定义,是独立于数据库之外的存在
案例1:Serializer功能1:请求数据校验
1.创建序列化器&&应用
'''
序列化器:Serializer
两大功能: 请求数据校验、对数据库查询到的对象进行序列化
'''
'''
Serializer功能一:数据校验
对客户端的请求数据进行校验
'''
# 1.定义序列化器
from rest_framework import serializers
from rest_framework import exceptions
class StudentSerializer(serializers.Serializer):
# 请求数据校验: 客户端需要提交以下格式的数据
name=serializers.CharField(max_length=32,label='姓名')
sex2=serializers.ChoiceField(label='性别2',choices=Students.age_choices)
age=serializers.IntegerField(label='年龄')
classmate=serializers.CharField(label='班级',max_length=10)
email1=serializers.EmailField(label='邮箱1') # 邮箱验证方式1
# email2=serializers.CharField(label='邮箱2',validators=[自定义邮箱验证方法(),]) # 邮箱验证方式2
email3=serializers.CharField(label='邮箱3') # 邮箱验证方法3:钩子函数
def validate_email3(self,value):
'''钩子函数,用于验证某个字段'''
if re.match(f"^\w+@\w+\.\w+$",value):
return value
raise exceptions.ValidationError("邮箱格式错误!")
# 2.视图中使用序列化器
class StudentsView(APIView):
def post(self,request):
# ①引用自定义的序列化器,并传入请求数据
# request.data:获取请求体中的数据
ser=StudentSerializer(data=request.data,)
# ②序列化器验证请求数据
# ser.is_valid(): 进行序列化中的数据校验
if ser.is_valid():
return Response({"code":2000,"message":"数据校验成功!","data":ser.validated_data})
else:
return Response({"code":1001,"detail":ser.errors})
2.postman模拟发送请求数据
①请求数据符合序列化器的校验规则
② 请求数据不符合序列化器的校验规则
如果想要返回的提示是中文,可在settings中设置: