高效开发REST API:Django REST Framework序列化器深度指南
原生Django实现学生管理API需要200+行代码,而DRF仅需20行!揭秘如何用序列化器提升10倍开发效率。
目录
一、Web应用模式演进
1.1 前后端不分离
1.2 前后端分离
二、API接口规范之争
2.1 RPC(远程过程调用)
2.2 RESTful(表征状态转移)
核心原则:
幂等性保证:
三、DRF核心:序列化器
3.1 序列化器的作用
序列化:模型对象 → Python字典 → JSON
反序列化:JSON → Python字典 → 模型对象
3.2 定义序列化器
3.3 常用字段类型速查
四、DRF环境配置实战
4.1 安装与配置
4.2 项目配置
4.3 模型定义
五、DRF极简开发模式
5.1 模型序列化器
5.2 视图集配置
5.3 路由配置
5.4 接口测试效果
六、高级序列化技巧
6.1 自定义验证
6.2 重写创建/更新
6.3 只读/只写字段
七、DRF核心优势总结
一、Web应用模式演进
1.1 前后端不分离
-
服务端主导:后端直接生成HTML/CSS/JS
-
工作流程:
graph LR
A[浏览器请求] --> B[应用服务器]
B --> C[数据库查询]
C --> D[模板渲染]
D --> E[返回HTML]
1.2 前后端分离
-
核心解耦:
-
前端:独立静态资源服务(HTML/CSS/JS)
-
后端:纯数据接口(JSON/XML)
-
-
数据交互流程:
graph LR
浏览器 --> |请求HTML| 静态服务器
浏览器 --> |请求数据| 应用服务器
应用服务器 --> 数据库
静态服务器 --> |返回文件| 浏览器
应用服务器 --> |返回JSON| 浏览器
二、API接口规范之争
2.1 RPC(远程过程调用)
-
特点:
-
单一入口:
http://api.xxx.com/
-
POST请求为主
-
参数指定动作:
action=get_students&class=301
-
数据格式:Protobuf/JSON/XML
-
-
痛点:
-
接口命名混乱
-
函数参数膨胀
-
历史接口重复
-
2.2 RESTful(表征状态转移)
-
核心原则:
-
资源即名词:
/students/
、/avatars/
-
HTTP动词定义操作:
HTTP方法 端点 动作 POST /students/ 创建学生 GET /students/ 获取所有学生 GET /students/<pk>/ 获取单个学生 PUT /students/<pk>/ 全量更新 PATCH /students/<pk>/ 部分更新 DELETE /students/<pk>/ 删除学生 -
-
幂等性保证:
方法 幂等 安全 GET ✓ ✓ POST ✗ ✗ PUT/PATCH ✓ ✗ DELETE ✓ ✗
三、DRF核心:序列化器
3.1 序列化器的作用
序列化:模型对象 → Python字典 → JSON
student = Student.objects.get(id=1)
serializer = StudentSerializer(student)
return JsonResponse(serializer.data)
反序列化:JSON → Python字典 → 模型对象
data = request.data
serializer = StudentSerializer(data=data)
if serializer.is_valid():serializer.save() # 保存到数据库
3.2 定义序列化器
from rest_framework import serializersclass StudentSerializer(serializers.Serializer):id = serializers.IntegerField(read_only=True)name = serializers.CharField(max_length=100)sex = serializers.BooleanField(default=True)age = serializers.IntegerField(min_value=0)description = serializers.CharField(allow_blank=True)
3.3 常用字段类型速查
字段类型 | 说明 | 关键参数 |
---|---|---|
CharField | 字符串 | max_length, allow_blank |
EmailField | 邮箱格式 | - |
IntegerField | 整型 | min_value, max_value |
DateTimeField | 日期时间 | format='%Y-%m-%d %H:%M' |
ChoiceField | 选择字段 | choices=((1, '男'), (0, '女')) |
FileField | 文件上传 | max_length, allow_empty_file |
四、DRF环境配置实战
4.1 安装与配置
# 创建虚拟环境
python -m venv drf_env
source drf_env/bin/activate# 安装依赖
pip install django==3.2.4 djangorestframework pymysql
4.2 项目配置
settings.py
关键配置:
INSTALLED_APPS = [...'rest_framework','students', # 你的应用
]DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'students','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': '123'}
}
4.3 模型定义
# students/models.py
class Student(models.Model):name = models.CharField(max_length=100, verbose_name="姓名")sex = models.BooleanField(default=True, verbose_name="性别")age = models.IntegerField(verbose_name="年龄")classmate = models.CharField(max_length=5, verbose_name="班级")description = models.TextField(verbose_name="签名")class Meta:db_table = "tb_student"
五、DRF极简开发模式
5.1 模型序列化器
# students/serializers.py
from rest_framework import serializers
from .models import Studentclass StudentModelSerializer(serializers.ModelSerializer):class Meta:model = Studentfields = '__all__' # 包含所有字段# fields = ('id', 'name', 'age') # 指定字段# exclude = ('description',) # 排除字段extra_kwargs = {'age': {'min_value': 0},'name': {'max_length': 50}}
5.2 视图集配置
# students/views.py
from rest_framework.viewsets import ModelViewSet
from .models import Student
from .serializers import StudentModelSerializerclass StudentViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer
5.3 路由配置
# students/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import StudentViewSetrouter = DefaultRouter()
router.register('students', StudentViewSet)urlpatterns = [path('', include(router.urls))
]
5.4 接口测试效果
DRF自动生成调试界面:
-
GET
/students/
:学生列表 -
POST
/students/
:创建学生 -
PUT
/students/1/
:更新ID=1的学生 -
DELETE
/students/1/
:删除学生
六、高级序列化技巧
6.1 自定义验证
class StudentSerializer(serializers.ModelSerializer):...# 字段级验证def validate_age(self, value):if value < 1:raise serializers.ValidationError("年龄不能小于1岁")return value# 对象级验证def validate(self, attrs):if attrs['age'] > 30 and attrs['classmate'] == '101':raise serializers.ValidationError("30岁以上不能加入101班")return attrs
6.2 重写创建/更新
def create(self, validated_data):# 添加额外逻辑if validated_data.get('score') > 90:validated_data['level'] = 'A'return Student.objects.create(**validated_data)def update(self, instance, validated_data):instance.name = validated_data.get('name', instance.name)...instance.save()return instance
6.3 只读/只写字段
class UserSerializer(serializers.ModelSerializer):password = serializers.CharField(write_only=True) # 仅用于输入last_login = serializers.DateTimeField(read_only=True) # 仅用于输出class Meta:model = Userfields = ('username', 'password', 'last_login')
七、DRF核心优势总结
-
序列化器:自动处理模型↔JSON转换
-
视图集:5行代码实现CRUD接口
-
认证模块:JWT/OAuth开箱即用
-
调试界面:自动生成API文档
-
扩展生态:过滤/分页/限流插件