Django REST Framework(DRF)RESTful 最完整版实战教程

本教程从零开始,带你构建一个专业可上线的 RESTful API ,涵盖 DRF

的核心功能:
Model → Serializer → APIView → GenericAPIView → ViewSet → JWT → 权限 →
分页 → 过滤 → 异常处理

非常适合 Django + SimpleJWT 的后端项目。


📌 目录

  1. 环境准备
  2. 创建 Django 项目
  3. 编写 Model
  4. Serializer(序列化器)
  5. APIView(基础)
  6. GenericAPIView + Mixins
  7. ViewSet + Router(企业最佳实践)
  8. 分页
  9. 过滤 / 搜索 / 排序
  10. 权限
  11. 认证(JWT)
  12. 全局异常处理
  13. 完整 RESTful API 示例

1️⃣ 安装 DRF

bash 复制代码
pip install djangorestframework

修改 settings.py

python 复制代码
INSTALLED_APPS = [
    ...
    'rest_framework',
]

2️⃣ 创建项目与 App

bash 复制代码
django-admin startproject myapi
cd myapi
python manage.py startapp users

3️⃣ Model(资源)

users/models.py

python 复制代码
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=32)
    email = models.EmailField()
    created_at = models.DateTimeField(auto_now_add=True)

4️⃣ Serializer(核心)

users/serializers.py

python 复制代码
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"

Serializer = Python对象 ↔ JSON 的转换器,是 DRF 的灵魂。


5️⃣ APIView(最基础的 RESTful)

users/views.py

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User
from .serializers import UserSerializer

class UserListCreateView(APIView):

    def get(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

URL:

python 复制代码
path("users/", UserListCreateView.as_view()),

6️⃣ GenericAPIView + Mixins(更 RESTful)

python 复制代码
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import User
from .serializers import UserSerializer

class UserListCreateView(ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetailView(RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

URL:

python 复制代码
path("users/", UserListCreateView.as_view()),
path("users/<int:pk>/", UserDetailView.as_view()),

RESTful API:

方法 URL 说明


GET /users/ 获取用户列表

POST /users/ 创建

GET /users/1/ 详情

PUT /users/1/ 修改

DELETE /users/1/ 删除


7️⃣ ViewSet + Router(企业最常用)

python 复制代码
from rest_framework.viewsets import ModelViewSet

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.py

python 复制代码
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register("users", UserViewSet)

urlpatterns = router.urls

自动生成:

复制代码
GET     /users/
POST    /users/
GET     /users/{id}/
PUT     /users/{id}/
PATCH   /users/{id}/
DELETE  /users/{id}/

企业 95% 采用 ViewSet。


8️⃣ 分页 Pagination

settings.py

python 复制代码
REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
    "PAGE_SIZE": 10
}

示例:

复制代码
GET /users/?page=2

9️⃣ 过滤 / 搜索 / 排序

安装:

bash 复制代码
pip install django-filter

settings.py

python 复制代码
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter',
    ]
}

启用:

python 复制代码
class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    filterset_fields = ["username"]
    search_fields = ["username", "email"]
    ordering_fields = ["created_at"]

🔟 权限(Permissions)

全局:

python 复制代码
REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
}

局部:

python 复制代码
permission_classes = [IsAuthenticated]

自定义权限:

python 复制代码
class IsAdmin(BasePermission):
    def has_permission(self, request, view):
        return request.user.is_staff

1️⃣1️⃣ 认证(Authentication) + JWT 登录

安装:

bash 复制代码
pip install djangorestframework-simplejwt

设置:

python 复制代码
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ]
}

路由:

python 复制代码
path("token/", TokenObtainPairView.as_view()),
path("token/refresh/", TokenRefreshView.as_view()),

请求示例:

复制代码
Authorization: Bearer <access_token>

1️⃣2️⃣ 全局异常处理

settings.py

python 复制代码
REST_FRAMEWORK = {
    "EXCEPTION_HANDLER": "utils.exceptions.custom_handler"
}

utils/exceptions.py

python 复制代码
from rest_framework.views import exception_handler

def custom_handler(exc, context):
    response = exception_handler(exc, context)
    if response:
        response.data = {
            "code": response.status_code,
            "message": response.data,
            "data": None
        }
    return response

1️⃣3️⃣ 最终 RESTful API 结构示例

复制代码
GET     /api/v1/users/
POST    /api/v1/users/
GET     /api/v1/users/<id>/
PATCH   /api/v1/users/<id>/
DELETE  /api/v1/users/<id>/

统一响应格式:

json 复制代码
{
  "code": 0,
  "message": "success",
  "data": { ... }
}

🎉 你已经掌握 DRF 最完整的 RESTful 实战流程!

相关推荐
月光船幽幽5 小时前
门控函数SHS阈值与调制机制解析
人工智能·python·算法
测试19985 小时前
2026全新软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
Zane19945 小时前
map 比推导式快"是真的吗?一文讲透 map、filter、reduce 与 lambda 的真实性能与设计取舍
后端·python
过期的秋刀鱼!6 小时前
带替换的采样
人工智能·python·算法·决策树·机器学习
Python私教6 小时前
AI Agent 可观测性不只是日志:一套可回放的多步执行链
人工智能·后端·python
Python私教6 小时前
模型越强越不需要 Skills?我把 AI 编程能力拆成 4 层
人工智能·后端·python
databook6 小时前
如何快速构建一个数据科学应用?从零到上线
python·机器学习·scikit-learn
上下求索,莫负韶华6 小时前
切面学习笔记
笔记·python·学习
2301_806709387 小时前
国内知名的生活水箱制造厂有哪些
python·生活
学掌门7 小时前
超级菜鸟怎么学习数据分析?
python·学习·数据分析