# 此文件定义子应用projects具备的模型类对应的序列化器
from rest_framework import serializers
class ProjectSerializer(serializers.Serializer):
"""
1。必须继承Serializer类或其子类
2。定义的序列化器类中的字段名要与对应模型类中的字段名保持一致
3。定义序列化器类的字段(类属性)为Field子类
4。默认定义那些字段,就会返回哪些字段给前端,如果未定义模型类中的某个字段,则该字段既不能输入,也不能输出
5。定义的序列化器字段中,required默认为True,表示定义的字段必须得输入和输出;
为False时,则为前端非必传,校验时会忽略该字段
6。write_only:如果某个字段指定了write_only=True,那么该字段仅仅需要前端输入(反序列化输入,做数据校验),
即必传参数,但是不会输出
7。read_only:如果某个字段制定了read_only=True,那么该字段仅仅只输出(序列化输出),可以不用输入
"""
id = serializers.IntegerField(label='项目id', help_text='项目id', max_value=50, min_value=1,
read_only=True)
full_name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=20, min_length=4)
leader = serializers.CharField(label='项目负责人', help_text='项目负责人', max_length=20, min_length=2,
write_only=True)
is_execute = serializers.BooleanField(label='项目是否执行', help_text='项目是否执行', required=False)
desc = serializers.CharField(label='项目描述', help_text='项目描述', allow_null=True, allow_blank=True)
create_time = serializers.DateTimeField(label='项目从创建时间', help_text='项目创建时间', format='%Y-%m-%d %H:%M:%S',
read_only=True)
update_time = serializers.DateTimeField(label='项目跟新时间', help_text='项目更新时间',
read_only=True)
1.反序列化输入时数据校验
1.1 序列化器类支持的属性字段类型中的参数
label:文档信息,在接口文档中显示,类似模型类中的verbose_name
help_text:文档信息,和模型类中的help_text作用一致
max_value:反序列化校验允许的最大值,一般在serializers.IntergerField()中使用
min_value:反序列化校验允许的最小值,一般在serializers.IntergerField()中使用
write_only:为True时字段校验时为必传参数,只允许反序列化写入做校验,不会输出
read_only:为True时该字段值前端不能传,只会做序列化输出,定义了
read_only=True,此时前端传入了该字段值,校验器不会做校验,
传入的值也不会入库,而是以空字符串入库,而且会影响后续的数
据入库,报错 "Duplicate entry '' for key 'name'"。
required:为True时指定该字段为必传字段
default:指定字段不传值时自动设置默认值入库
allow_null:是否允许该字段为null,对应models中也要定义null=True才能使用
allow_blank:是否允许该字段为空字符串,对应models中也要定义null=True才能使用
format:格式化输出serializers.DateTimeField()字段,
如:format='%Y年%m月%d日 %H:%M:%S'
2. 序列化器对普通对象的数据校验(非QuerySet/模型对象)
可以自定义个序列化器,对普通的类属性也可以进行数据校验