DRF的Serializer

名词释义

序列化:模型转换为json,即对象-字典-json

反序列化:json转换为模型,即json-字典-对象

字段参数

默认使用模型中的字段约束进行校验,自定义字段约束参考Serializer fields

常用的约束包括:

  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 字段最小值

字段校验(反序列化)

对单个字段校验使用的是validate_<filed_name>,如:

1
2
3
4
def validate_name(self, value):
if User.objects.filter(name=value):
raise serializers.ValidationError(detail='用户名已存在')
return value

对所有字段校验使用的是validate,如:

1
2
3
4
5
def validate(self,attr):
if attr['name'] or attr['email']:
return attr
else:
raise serializers.ValidationError(detail='用户名或邮箱至少填一个')

校验顺序:

  1. 参数限定校验,(失败则不会向下校验)
  2. 单字段校验(无论成功或失败都会继续校验)
  3. 多字段校验

校验数据的使用:

1
2
3
4
5
6
7
8
# 指定需要校验的数据
serializer = self.serializer_class(data=request.data)
# 进行字段校验,如果失败则会报错
serializer.is_valid(raise_exception=True)
# 获取校验未通过的提示
serializer.errors
# 获取校验通过的数据
serializer.validated_date

序列化

指定序列化字段:

1
2
3
4
5
6
class Meta:
model = User
# 指定字段使用元组,所有字段使用"__all__"
fields = ('name', 'age',)
# 指定只能序列化,无法反序列化的字段
read_only_fields = ('created_at', 'updated_at')

指定单个字段进行自定义序列化:

1
2
3
4
5
password = serializers.SerializerMethodField()

def get_password(self, instance):
# instance为当前的实例,即view中的get_object()
return "******"

对所有字段进行自定义序列化:

1
2
def to_representation(self, instance):
return dict()

view使用序列化:

1
2
3
4
# 对data进行序列化,data为queryset或者object,如果是queryset,需要加上many=True
serializer = self.serializer_class(data, many=True)
# 返回一个OrderedDict,转换为列表即可得到指定的值
result_dict = serializer.data

数据库写入操作

serializer提供了create和update的功能,分别对应post请求和put/patch请求。如:

1
2
3
4
5
6
7
8
9
10
def update(self, instance, validated_data):
instance.update(**validated_data)
instance.updated_at = timezone.now()
instance.save()
return instance

def create(self, validated_data):
instance = User(**validated_data)
instance.save()
return instance

参考内容

Django_rest framework_序列化器和自定义校验