Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类:
1. 基础视图类
这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。

常用类
-
APIView:- 最基本的视图类,所有其他视图类都继承自它。
- 需要手动实现
get、post、put、delete等方法。 - 适合需要完全自定义逻辑的场景。
from rest_framework.views import APIView from rest_framework.response import Responseclass MyView(APIView):def get(self, request):return Response({"message": "Hello, World!"}) -
GenericAPIView:- 继承自
APIView,提供了更多的通用功能(如get_queryset、get_serializer等)。 - 通常与
Mixin类一起使用,以实现更高级的功能。
from rest_framework.generics import GenericAPIView from rest_framework.response import Responseclass MyView(GenericAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get(self, request):instances = self.get_queryset()serializer = self.get_serializer(instances, many=True)return Response(serializer.data) - 继承自
2. 通用视图类(Generic Views)
这些视图类基于 GenericAPIView,并结合了 Mixin 类,提供了更高级的功能。
常用类
-
ListAPIView:- 用于实现列表视图(只读)。
- 默认实现了
get方法。
from rest_framework.generics import ListAPIViewclass MyListView(ListAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer -
RetrieveAPIView:- 用于实现详情视图(只读)。
- 默认实现了
get方法。
from rest_framework.generics import RetrieveAPIViewclass MyDetailView(RetrieveAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer -
CreateAPIView:- 用于实现创建视图。
- 默认实现了
post方法。
from rest_framework.generics import CreateAPIViewclass MyCreateView(CreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer -
UpdateAPIView:- 用于实现更新视图。
- 默认实现了
put和patch方法。
from rest_framework.generics import UpdateAPIViewclass MyUpdateView(UpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer -
DestroyAPIView:- 用于实现删除视图。
- 默认实现了
delete方法。
from rest_framework.generics import DestroyAPIViewclass MyDeleteView(DestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer -
ListCreateAPIView:- 结合了
ListAPIView和CreateAPIView。 - 默认实现了
get和post方法。
from rest_framework.generics import ListCreateAPIViewclass MyListCreateView(ListCreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 结合了
-
RetrieveUpdateAPIView:- 结合了
RetrieveAPIView和UpdateAPIView。 - 默认实现了
get、put和patch方法。
from rest_framework.generics import RetrieveUpdateAPIViewclass MyRetrieveUpdateView(RetrieveUpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 结合了
-
RetrieveDestroyAPIView:- 结合了
RetrieveAPIView和DestroyAPIView。 - 默认实现了
get和delete方法。
from rest_framework.generics import RetrieveDestroyAPIViewclass MyRetrieveDestroyView(RetrieveDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 结合了
-
RetrieveUpdateDestroyAPIView:- 结合了
RetrieveAPIView、UpdateAPIView和DestroyAPIView。 - 默认实现了
get、put、patch和delete方法。
from rest_framework.generics import RetrieveUpdateDestroyAPIViewclass MyRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 结合了
3. 视图集(ViewSets)
视图集将多个视图逻辑组合在一起,通常与路由器(Router)一起使用,自动生成 URL 配置。
常用类
-
ViewSet:- 类似于
APIView,但将多个操作(如list、create、retrieve等)组合在一起。 - 需要手动实现各个操作。
from rest_framework import viewsets from rest_framework.response import Responseclass MyViewSet(viewsets.ViewSet):def list(self, request):return Response({"message": "List view"})def create(self, request):return Response({"message": "Create view"}) - 类似于
-
ModelViewSet:- 继承自
GenericAPIView和多个Mixin类,默认实现了完整的 CRUD 操作。 - 适合标准的模型操作。
from rest_framework import viewsetsclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 继承自
-
ReadOnlyModelViewSet:- 继承自
ModelViewSet,但只提供只读操作(list和retrieve)。
from rest_framework import viewsetsclass MyReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer - 继承自
4. 其他视图类
-
GenericViewSet:- 结合了
GenericAPIView和ViewSet的功能。 - 通常与
@action装饰器一起使用,定义自定义操作。
from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Responseclass MyGenericViewSet(viewsets.GenericViewSet):@action(detail=False, methods=['get'])def custom_action(self, request):return Response({"message": "Custom action"}) - 结合了
-
mixins:- 提供了一些通用的功能(如
ListModelMixin、CreateModelMixin等),通常与GenericAPIView或GenericViewSet一起使用。
- 提供了一些通用的功能(如
总结
- 最常用的类:
APIView:适合完全自定义逻辑。ModelViewSet:适合标准的模型 CRUD 操作。ListAPIView、RetrieveAPIView等:适合简单的只读或写操作。GenericAPIView:适合需要结合Mixin实现高级功能的场景。