这里以学生为例,列举了基本的CURD和其他的功能
1、功能的序列化
需要以这个数据为中心找到其所对应的主要功能;如:增、删、改、查、其他
class StudentSerializer(CustomModelSerializer):
"""核心类"""
# 注意创建和更新共同点较多,继承了同一个类;
# 同时批量导入的功能属于批量新增,所以也要继承这个类
class StudentCreateSerializer(StudentSerializer):
"""创建"""
# class StudentDeleteSerializer(CustomModelSerializer):
# """删除"""
# 可以没有删除的序列化,删除的序列化属于更新这一个内容
class StudentUpdateSerializer(StudentSerializer):
"""更新"""
class StudentReadSerializer(CustomModelSerializer):
"""查询"""
class StudentExportSerializer(CustomModelSerializer):
"""其他功能:导出"""
class StudentImportSerializer(StudentSerializer):
"""其他功能:导入"""
2、填写字段
一、序列化器中的类属性字段
序列化中所定义的类属性字段,一般情况下与模型类字段相对应
默认情况下,这些类属性字段既可以进行序列化输出,也可以进行反序列化输入
不需要输入(反序列化)、输出(序列化)的字段,则不需要定义
只需要反序列化输入,则定义write_only = True
只需要序列化输出,则定义read_only = True
响应的参数如果是多个查询集,需要在JsonResponse()中传参many=True
二、类属性字段的参数
1.通用参数
read_only = True:当前字段只能进行序列化输出(用于不需要反序列化输入的字段)
write_only = True:当前字段只能进行反序列化输入,不进行序列化输出
required = True:在反序列化时是必填字段,默认为True
allow_null = False:当前字段是否允许传None,默认是False(必填字段False,反之则True)
allow_blank = False:当前字段是否运行为空,默认是False(必填字段False,反之则True)
default = xx:指定在反序列化时,当前字段没值时所使用的默认值
validators=校验器:当前字段所使用的校验器(下面介绍常用的)
error_messages:包含错误key-value的字段(下面会举例)
label:当前字段在前端的api页面中所显示的字段名称
2.选项参数
max_length:字段最大长度
min_length:字段最小长度
trim_whitespace:是否截断空字符串
max_value:字段最大值
min_value:字段最小值
三、反序列化_校验机制
调用序列化器对象的is_valid()方法,校验前端参数的正确性,不调用则不校验
校验成功返回True、校验失败返回False
is_valid(raise_exception = True):校验失败后,则抛出异常
当调用is_valid()之后,才能调用序列化器对象的errors属性,内容为校验的错误提示(dict)
在views.py中,如果传参进行了输入反序列化的话,那么需要调用的是经过校验后的数据,比如说新增数据,应该是:xxx类.objects.create(**serializer.validated_data)
try:
# 不符合规则则抛出错误
serializer.is_valid(raise_exception=True)
except Exception as e:
# 返回序列化器原有的dict类型的错误信息
return JsonResponse(serializer.errors)
四、rest_framework的校验器(用于validators=校验器)
rest_framework.framework中有有多个验证器,这里用其中一个最常见的UniqueValidator唯一验证器示例,更多见:https://juejin.im/post/5aa93246518825555c1d5bba
UniqueValidator唯一校验器
该验证器可用于在模型字段上强制实施 unique=True 约束。它需要一个必需的参数和一个可选的 messages 参数:
1.queryset 必须 - 这是校验唯一性的查询集,一般是模型类.objects.all()
2.message - 校验失败时使用的错误消息
3.lookup - 用于查找已校验值的现有实例。默认为 'exact'
例子:修改之前的serializer.py,对name字段使用UniqueValidator唯一校验器
class StudentSerializer(CustomModelSerializer):
"""
该验证器可用于在模型字段上强制实施 unique=True 约束。它需要一个必需的参数和一个可选的 messages 参数:
queryset 必须 - 这是验证唯一性的查询集。
message - 验证失败时使用的错误消息。
lookup - 用于查找已验证值的现有实例。默认为 'exact'
"""
name = serializers.CharField(label='用户名', max_length=128, min_length = 10, help_text='用户名',
validators=[
UniqueValidator(
queryset=User.objects.all(),
message="该用户名已存在"
)
],
error_messages = {
## 键值对,对应上面的限制条件,以及对应的提示
"max_length":"最长128个字符",
"min_length ":"最短10个字符"
}
)
password = serializers.CharField(label='账号密码', max_length=256, help_text='账号密码', )
email = serializers.EmailField(label='账号密码', max_length=128, help_text='账号密码',
allow_null=True, allow_blank=True, default='')
sex = serializers.CharField(label='账号密码', max_length=128, help_text='账号密码', )
c_time = serializers.DateTimeField(label='创建时间', help_text='创建时间', read_only=True)