高效开发REST API:Django REST Framework序列化器深度指南

发布于:2025-06-16 ⋅ 阅读:(20) ⋅ 点赞:(0)

        原生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 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核心优势总结

  1. 序列化器:自动处理模型↔JSON转换

  2. 视图集:5行代码实现CRUD接口

  3. 认证模块:JWT/OAuth开箱即用

  4. 调试界面:自动生成API文档

  5. 扩展生态:过滤/分页/限流插件


网站公告

今日签到

点亮在社区的每一天
去签到