Serializer

一、序列化器是什么?

序列化器相当于 Django 表单在 API 中的​​高级版本​​:

  • 序列化​​:将复杂数据(模型实例、查询集)转换为 Python 数据类型 → JSON

  • ​反序列化​​:将客户端提交的数据(JSON)验证后转换为 Python 对象 → 模型实例

  • ​数据验证​​:验证传入数据的完整性和安全性

二、序列化器类型

1. Serializer 基础类

  • 需手动定义所有字段

  • 适用于非模型数据或简单需求

from rest_framework import serializers

class BasicSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100)
    email = serializers.EmailField()
    age = serializers.IntegerField(min_value=0)

2. ModelSerializer(最常用)

  • 自动根据模型生成字段

  • 自动创建create()和update()方法

3. HyperlinkedModelSerializer

  • 包含超链接代替 ID

三、序列化器设置

1. Meta 类配置(ModelSerializer 核心)

​配置项​

​适用字段类型​

​说明​

​示例​

​默认值​

read_only​​

所有字段

设置为只读字段,反序列化时忽略

{'created_at': {'read_only': True}}

False

write_only​​

所有字段

设置为只写字段,序列化时不包含

{'password': {'write_only': True}}

False

required​​

所有字段

字段是否为必填项

{'email': {'required': True}}

根据字段类型

allow_null​​

可为空的字段

是否允许 None 值

{'middle_name': {'allow_null': True}}

False

allow_blank​​

字符串字段

是否允许空字符串 ('')

{'description': {'allow_blank': True}}

False

trim_whitespace​​

CharField

是否在验证前去除字符串两端的空白

{'username': {'trim_whitespace': True}}

True

max_length​​

文本相关字段

最大长度限制

{'title': {'max_length': 100}}

min_length​​

文本相关字段

最小长度限制

{'password': {'min_length': 8}}

max_value​​

数值字段

最大值限制

{'age': {'max_value': 120}}

min_value​​

数值字段

最小值限制

{'rating': {'min_value': 1}}

validators​​

所有字段

添加额外的验证器

{'username': {'validators': [validate_username]}}

[]

error_messages​​

所有字段

自定义错误消息

{'age': {'error_messages': {'min_value': '年龄不能小于0'}}}

字段默认

style​​

所有字段

控制渲染时的样式(主要用于API文档)

{'password': {'style': {'input_type': 'password'}}}

label​​

所有字段

字段的标签(用于表单渲染)

{'email': {'label': '电子邮箱'}}

字段名

help_text​​

所有字段

字段的帮助文本

{'content': {'help_text': '请输入内容'}}

default​​

所有字段

字段的默认值

{'status': {'default': 'draft'}}

initial​​

所有字段

字段的初始值

{'category': {'initial': 'tech'}}

source​​

所有字段

指定字段的数据来源

{'pub_date': {'source': 'published_date'}}

字段名

format​​

日期时间字段

格式化输出

{'created_at': {'format': '%Y-%m-%d %H:%M'}}

ISO 8601

input_formats​​

日期时间字段

指定反序列化时接受的输入格式

{'birthday': {'input_formats': ['%Y-%m-%d', '%d/%m/%Y']}}

多种格式

lookup_field​​

关系字段

指定关联对象查找的字段

{'author': {'lookup_field': 'username'}}

'pk'

lookup_url_kwarg​​

关系字段

指定URL中的关键字参数名

{'author': {'lookup_url_kwarg': 'username'}}

同 lookup_field

view_name​​

HyperlinkedRelatedField

指定用于生成超链接的视图名称

{'url': {'view_name': 'user-detail'}}

queryset​​

关系字段

指定查询集

{'category': {'queryset': Category.objects.active()}}

模型默认

many​​

关系字段

指定是否为多对多关系

{'tags': {'many': True}}

根据关系类型

allow_empty​​

列表字段

是否允许空列表

{'tags': {'allow_empty': True}}

True

child​​

ListField

指定列表元素的字段类型

{'scores': {'child': IntegerField(min_value=0, max_value=100)}}

to_representation​​

所有字段

自定义序列化方法

{'full_name': {'to_representation': self.format_name}}

to_internal_value​​

所有字段

自定义反序列化方法

{'full_name': {'to_internal_value': self.parse_name}}

2. 字段类型与选项配置

3. 自定义验证配置

1. 字段级验证

命名规则:validate_<field_name>

  • 序列化器会自动识别以validate_开头,后面跟着字段名称的方法。

  • 在验证过程中,当处理到特定字段时,会自动调用对应的验证函数。

2. 对象级验证

函数名称:validate

  • 序列化器会固定识别名为validate的方法作为对象级验证函数。

  • 该方法在字段级验证之后执行,用于验证多个字段之间的关系。

3. 验证器配置

四. 示例

​方法名​

​用途​

​返回值​

​示例​

is_valid()

验证数据

bool

serializer.is_valid()

save()

保存数据

模型实例

course = serializer.save()

errors

获取错误

dict

errors = serializer.errors

data

序列化数据

dict

json_data = serializer.data

validated_data

验证后数据

dict

clean_data = serializer.validated_data

最后更新于