DRF:Django REST Framework框架介绍

"在前后端彻底分离的时代,不掌握DRF,就等于错过了Django的下半场。 "

------这句话,适合贴在每个Python开发者的显示器边框。


一、为什么要学DRF?------API经济的入场券

维度 传统Django DRF
协议 HTML JSON/XML/YAML
客户端 浏览器 任意(Web、iOS、Android、IoT)
并发模型 同步渲染 异步解耦
团队协同 前后端串行 并行开发,效率×3

一句话总结:
DRF把"Django"变成了"Django as a Service"。


二、5张图,吃透DRF核心组件

1. 一张"地铁图"看透请求生命周期

站点 对应DRF组件 开发提示
入口安检 APIView/@api_view 权限、限流、版本号统一入口
序列化闸机 Serializer/ModelSerializer 数据清洗、字段校验、反序列化一键完成
数据库月台 GenericViewSet + queryset 一行代码搞定CRUD
出站检票 Response + Renderer JSON、CSV、YAML可插拔切换

2. 序列化:比ORM更强大的"翻译官"

python 复制代码
# models.py
class Employee(models.Model):
    name = models.CharField(max_length=50)
    join_date = models.DateField()
    salary = models.DecimalField(max_digits=12, decimal_places=2)

# serializers.py
class EmployeeSerializer(serializers.ModelSerializer):
    # 只读字段:工龄
    years_of_service = serializers.SerializerMethodField()
    # 写字段:一次性调薪百分比
    raise_percent = serializers.FloatField(write_only=True, default=0)

    class Meta:
        model = Employee
        fields = ["id", "name", "join_date", "salary", "years_of_service", "raise_percent"]

    def get_years_of_service(self, obj):
        return (date.today() - obj.join_date).days // 365

    def update(self, instance, validated_data):
        percent = validated_data.pop("raise_percent", 0)
        instance.salary *= (1 + percent / 100)
        return super().update(instance, validated_data)

把"数据库行"翻译成"前端JSON",还能顺手做业务计算,这就是序列化的威力。


3. 视图"三阶进化":从10行到1行代码

阶段 写法 代码量 适用场景
① 原生APIView 手写get/post/delete 30+ 高度定制逻辑
② GenericAPIView+mixins ListModelMixin, CreateModelMixin... 10 标准CRUD
③ ViewSet + Router 自动生成路由 1 80%业务场景
python 复制代码
# urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r"employees", EmployeeViewSet)

urlpatterns = [
    path("api/", include(router.urls)),  # 一次性注册CRUD+分页+过滤
]

ViewSet= 让代码瘦成一道闪电⚡️


4. 权限与限流:给企业API上"双重锁"

python 复制代码
# permissions.py
class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

# settings.py
REST_FRAMEWORK = {
    "DEFAULT_THROTTLE_CLASSES": [
        "rest_framework.throttling.AnonRateThrottle",
        "rest_framework.throttling.UserRateThrottle",
    ],
    "DEFAULT_THROTTLE_RATES": {
        "anon": "100/day",
        "user": "1000/day",
    },
}

权限颗粒度到"数据行",限流动态可配,DRF让ToB交付更安心。


5. 文档即代码:Swagger-UI零成本生成

安装:

bash 复制代码
pip install drf-spectacular

一行配置:

python 复制代码
REST_FRAMEWORK = {
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

访问 http://localhost:8000/api/schema/swagger/

从此写代码=写文档,产品经理再也不会说"接口文档又双叒叕滞后了"。


三、实战:用DRF 15分钟上线一个"可搜索+分页+权限"的员工API

步骤 命令/代码 耗时
1. 创建项目 & 安装依赖 django-admin startproject hr_system && pip install djangorestframework django-filter 2'
2. 建模 & 初始化数据 python manage.py loaddata mock_emps.json 3'
3. 序列化 & 视图 & 路由 见上文代码块 5'
4. 配置过滤&搜索&分页 见下方代码 3'
5. 运行 & Swagger验证 python manage.py runserver 2'
python 复制代码
# views.py
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters

class EmployeeViewSet(viewsets.ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer
    permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ["department", "level"]
    search_fields = ["name", "email"]
    ordering_fields = ["salary", "join_date"]
    pagination_class = PageNumberPagination  # 默认20条/页

15分钟,你得到的是一个生产级、带文档、可搜索、可分页、带权限的REST API

如果手写Flask或Spring,同等功能至少需要2小时起步。


四、避坑指南:DRF新手最常踩的5个坑

  1. 把序列化当ORM用

    Serializer.save()里写复杂业务 → 应放到ModelViewSet.perform_create()或service层。

  2. 滥用APIView

    能用ModelViewSet就别手写get/post,否则一夜回到"自由泳"。

  3. 忽略select_related/prefetch_related

    循环嵌套序列化外键,N+1查询直接拖垮数据库。

  4. 把权限写在每个视图

    全局DEFAULT_PERMISSION_CLASSES+局部覆盖,才是DRF推荐姿势。

  5. 部署不关Debug

    生产环境忘记设置DEBUG=False,Swagger泄露全部字段结构,安全漏洞原地爆炸


五、写在最后

"框架每年一换,但对API设计思想的理解 会让你在未来10年持续受益。"

掌握DRF,不只是多学了一个库,而是真正迈入前后端分离、微服务、API经济的大门

相关推荐
间彧4 小时前
Java HashMap如何合理指定初始容量
后端
用户4099322502124 小时前
PostgreSQL全表扫描慢到崩溃?建索引+改查询+更统计信息三招能破?
后端·ai编程·trae
PFinal社区_南丞4 小时前
PostgreSQL-10个鲜为人知的强大功能
数据库·后端
superlls4 小时前
(Spring)Spring Boot 中 @Valid 与全局异常处理器的联系详解
java·spring boot·后端
0110_10244 小时前
tauri + rust的环境搭建---初始化以及构建
开发语言·后端·rust
文心快码BaiduComate5 小时前
限时集福!Comate挂件/皮肤上线,符(福)气掉落中~
前端·后端·程序员
我星期八休息5 小时前
C++智能指针全面解析:原理、使用场景与最佳实践
java·大数据·开发语言·jvm·c++·人工智能·python
道之极万物灭5 小时前
Go小工具合集
开发语言·后端·golang
瑞士卷@5 小时前
MyBatis入门到精通(Mybatis学习笔记)
java·数据库·后端·mybatis