DRF 视图架构与使用实践
请求与响应机制
Request 对象由 DRF 扩展自 Django 原生的 HttpRequest,具备自动解析请求体的能力。根据 Content-Type 头部,它会调用对应的解析器(如 JSON、Form 等)将数据转换为可操作的字典结构。
request.data:返回已解析后的请求体内容。request.query_params:等价于 Django 的request.GET,用于获取查询参数。
Response 类用于构建响应对象,支持灵活的数据渲染。其构造函数为:
Response(data, status=None, template_name=None, headers=None, content_type=None)
.data:待渲染的序列化数据(未处理)。.status_code:HTTP 状态码数值。.content:经过渲染后返回给客户端的实际内容。
视图类型与实现方式
APIView 基类
rest_framework.views.APIView 是所有视图的根类。开发者需手动定义 get()、post() 等方法来处理不同请求类型。
class BookList(APIView):
def get(self, request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
GenericAPIView 通用基类
继承自 APIView,提供数据库查询和序列化器管理的便捷接口,通常搭配 Mixin 使用。
queryset:指定模型查询集。serializer_class:指定使用的序列化器类。get_queryset():返回当前视图所用的查询集。get_object():根据主键获取单个模型实例。get_serializer():返回序列化器实例。
Mixin 扩展类
五个核心 Mixin 提供标准增删改查逻辑,可组合使用以减少重复代码:
ListModelMixin:实现列表展示(list())。CreateModelMixin:实现创建资源(create())。RetrieveModelMixin:实现详情获取(retrieve())。UpdateModelMixin:实现完整更新(update())或部分更新(partial_update())。DestroyModelMixin:实现删除操作(destroy())。
预定义子类视图
DRF 提供八种常用视图子类,封装了常见场景的逻辑:
CreateAPIView:仅支持POST创建。ListAPIView:仅支持GET列表。RetrieveAPIView:仅支持GET详情。DestroyAPIView:仅支持DELETE删除。UpdateAPIView:支持PUT与PATCH。RetrieveUpdateAPIView:支持GET、PUT、PATCH。RetrieveUpdateDestroyAPIView:支持全部四种操作。
视图集(ViewSet)
ViewSet 基类
将一组相关操作集中在一个类中,通过 action 方法表达行为,而非直接绑定请求方法。例如:
class UserViewSet(viewsets.ViewSet):
def list(self, request):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
user = get_object_or_404(User, pk=pk)
serializer = UserSerializer(user)
return Response(serializer.data)
GenericViewSet
整合 GenericAPIView 和 ViewSetMixin,支持与 Mixin 组合使用,简化开发流程。
ModelViewSet 与 ReadOnlyModelViewSet
ModelViewSet:包含全部五种操作的完整视图集。ReadOnlyModelViewSet:仅支持读取操作(列表与详情)。
自定义动作(Action)
可通过 @action 装饰器添加额外功能,如最新图书推荐或阅读量更新:
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
@action(methods=['get'], detail=False)
def latest(self, request):
book = BookInfo.objects.latest('id')
return Response(BookInfoSerializer(book).data)
@action(methods=['put'], detail=True)
def read(self, request, pk):
book = self.get_object()
book.bread = request.data.get('bread', book.bread)
book.save()
return Response(BookInfoSerializer(book).data)
路由自动注册(Routers)
使用 routers.SimpleRouter 可自动生成标准 URL 模式:
router = routers.SimpleRouter()
router.register(r'books', BookInfoViewSet, basename='book')
# 自动生成:
# ^books/$ → name: book-list
# ^books/{pk}/$ → name: book-detail
# ^books/latest/$ → name: book-latest
# ^books/{pk}/read/$ → name: book-read
确保自定义 action 正确配置 detail 和 methods 参数,以便路由器正确生成路径。