DRF 使用APIView编写第一个DRF API的完整教程
本教程将手把手教你用Django REST Framework的APIView类创建第一个RESTful API,涵盖从环境搭建到接口测试的全流程。
一、环境准备
1.1 创建Django项目
1 # 创建项目目录
2 mkdir myapi && cd myapi
3
4 # 创建虚拟环境
5 python -m venv venv
6 source venv/bin/activate # Linux/Mac
7 venv\Scripts\activate # Windows
8
9 # 安装依赖
10 pip install django djangorestframework
11
12 # 初始化项目
13 django startproject django-rebort
*备注:
1、如果本地安装了django,但项目初始化时报找不到 django-admin 模块,那就更换命令为:django startproject django-rebort
2、使用pycharm创建django项目(社区版无此功能),https://blog.csdn.net/m0_67402026/article/details/126113879
1.2 配置DRF
1 # core/settings.py 2 INSTALLED_APPS = [ 3 ... 4 'rest_framework', # 新增DRF 5 ]
二、创建书籍管理API
2.1 定义数据模型
1 # 创建新应用 2 python manage.py startapp books 3 4 # books/models.py 5 from django.db import models 6 7 class Book(models.Model): 8 title = models.CharField(max_length=200) 9 author = models.CharField(max_length=100) 10 published_date = models.DateField() 11 12 def __str__(self): 13 return self.title
2.2 数据库迁移
1 python manage.py makemigrations 2 python manage.py migrate
三、创建序列化器
3.1 序列化器类
1 # books/serializers.py 2 from rest_framework import serializers 3 from .models import Book 4 5 class BookSerializer(serializers.ModelSerializer): 6 class Meta: 7 model = Book 8 fields = ['id', 'title', 'author', 'published_date']
四、编写APIView视图
4.1 实现CRUD操作
1 # books/views.py 2 from rest_framework.views import APIView 3 from rest_framework.response import Response 4 from rest_framework import status 5 from .models import Book 6 from .serializers import BookSerializer 7 8 class BookListCreateAPIView(APIView): 9 """ 10 处理GET(列表)和POST(创建)请求 11 """ 12 def get(self, request): 13 books = Book.objects.all() 14 serializer = BookSerializer(books, many=True) 15 return Response(serializer.data) 16 17 def post(self, request): 18 serializer = BookSerializer(data=request.data) 19 if serializer.is_valid(): 20 serializer.save() 21 return Response(serializer.data, 22 status=status.HTTP_201_CREATED) 23 return Response(serializer.errors, 24 status=status.HTTP_400_BAD_REQUEST) 25 26 class BookDetailAPIView(APIView): 27 """ 28 处理GET(详情)/PUT(更新)/DELETE(删除) 29 """ 30 def get_object(self, pk): 31 try: 32 return Book.objects.get(pk=pk) 33 except Book.DoesNotExist: 34 return None 35 36 def get(self, request, pk): 37 book = self.get_object(pk) 38 if not book: 39 return Response(status=status.HTTP_404_NOT_FOUND) 40 serializer = BookSerializer(book) 41 return Response(serializer.data) 42 43 def put(self, request, pk): 44 book = self.get_object(pk) 45 if not book: 46 return Response(status=status.HTTP_404_NOT_FOUND) 47 48 serializer = BookSerializer(book, data=request.data) 49 if serializer.is_valid(): 50 serializer.save() 51 return Response(serializer.data) 52 return Response(serializer.errors, 53 status=status.HTTP_400_BAD_REQUEST) 54 55 def delete(self, request, pk): 56 book = self.get_object(pk) 57 if not book: 58 return Response(status=status.HTTP_404_NOT_FOUND) 59 book.delete() 60 return Response(status=status.HTTP_204_NO_CONTENT)
五、配置路由
5.1 URL映射
1 # core/urls.py 2 from django.urls import path 3 from books import views 4 5 urlpatterns = [ 6 # 书籍列表和创建 7 path('books/', views.BookListCreateAPIView.as_view()), 8 9 # 单个书籍操作 10 path('books/<int:pk>/', views.BookDetailAPIView.as_view()), 11 ]
六、测试API接口
6.1 使用Django Shell创建测试数据
1 python manage.py shell 2 >>> from books.models import Book 3 >>> Book.objects.create(title="Python编程", author="Guido", published_date="2023-01-01")
具体执行结果如下

6.2 启动服务
python manage.py runserver
6.3 通过curl测试接口
# 获取书籍列表
curl http://127.0.0.1:8000/books/
# 创建新书籍
curl -X POST -H "Content-Type: application/json" \
-d '{"title":"DRF指南","author":"Tom","published_date":"2023-06-01"}' \
http://127.0.0.1:8000/books/
# 更新书籍
curl -X PUT -H "Content-Type: application/json" \
-d '{"title":"DRF高级指南"}' \
http://127.0.0.1:8000/books/2/
6.3 浏览器访问API
访问 http://localhost:8000/books/ 即可看到Web界面
七、APIView核心机制解析
7.1 请求处理流程
请求接收:APIView 继承自Django 的View类
方法分发:通过 HTTP 方法名称(get/post/put等)自动路由
请求解析:自动将JSON/form-data转换为 Python 字典
响应渲染:自动将 Python 对象转换为 JSON 格式
7.2 与 Django View 的关键区别
| 特性 | Django View | DRF APIView |
|---|---|---|
| 请求解析 | 需手动处理request.POST |
自动解析JSON/表单数据 |
| 响应格式 | 需手动返回HttpResponse |
自动渲染为JSON |
| 异常处理 | 需自定义错误响应 | 内置统一异常处理 |
| 认证/权限 | 需手动实现 | 提供装饰器配置 |
八、最佳实践建议
- 保持视图简洁:将业务逻辑移到
service层 - 添加分页支持:使用
PageNumberPagination
1 from rest_framework.pagination import PageNumberPagination 2 3 class BookListCreateAPIView(APIView): 4 def get(self, request): 5 books = Book.objects.all() 6 paginator = PageNumberPagination() 7 page = paginator.paginate_queryset(books, request) 8 serializer = BookSerializer(page, many=True) 9 return paginator.get_paginated_response(serializer.data)
- 添加版本控制:在
URL或header中指定API版本 - 通过本教程,您已经掌握了使用
APIView创建基础API的核心技能。

浙公网安备 33010602011771号