原生Django实现学生管理API需要200+行代码,而DRF仅需20行!揭秘如何用序列化器提升10倍开发效率。
目录
一、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 serializers
class 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 Student
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = '__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 StudentModelSerializer
class 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 StudentViewSet
router = 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 = User
fields = ('username', 'password', 'last_login')
七、DRF核心优势总结
序列化器:自动处理模型↔JSON转换
视图集:5行代码实现CRUD接口
认证模块:JWT/OAuth开箱即用
调试界面:自动生成API文档
扩展生态:过滤/分页/限流插件