Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类:
1. 基础视图类
这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。
常用类
-
APIView
:- 最基本的视图类,所有其他视图类都继承自它。
- 需要手动实现
get
、post
、put
、delete
等方法。 - 适合需要完全自定义逻辑的场景。
pythonfrom rest_framework.views import APIView from rest_framework.response import Response class MyView(APIView): def get(self, request): return Response({"message": "Hello, World!"})
-
GenericAPIView
:- 继承自
APIView
,提供了更多的通用功能(如get_queryset
、get_serializer
等)。 - 通常与
Mixin
类一起使用,以实现更高级的功能。
pythonfrom rest_framework.generics import GenericAPIView from rest_framework.response import Response class MyView(GenericAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def 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
方法。
pythonfrom rest_framework.generics import ListAPIView class MyListView(ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
-
RetrieveAPIView
:- 用于实现详情视图(只读)。
- 默认实现了
get
方法。
pythonfrom rest_framework.generics import RetrieveAPIView class MyDetailView(RetrieveAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
-
CreateAPIView
:- 用于实现创建视图。
- 默认实现了
post
方法。
pythonfrom rest_framework.generics import CreateAPIView class MyCreateView(CreateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
-
UpdateAPIView
:- 用于实现更新视图。
- 默认实现了
put
和patch
方法。
pythonfrom rest_framework.generics import UpdateAPIView class MyUpdateView(UpdateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
-
DestroyAPIView
:- 用于实现删除视图。
- 默认实现了
delete
方法。
pythonfrom rest_framework.generics import DestroyAPIView class MyDeleteView(DestroyAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
-
ListCreateAPIView
:- 结合了
ListAPIView
和CreateAPIView
。 - 默认实现了
get
和post
方法。
pythonfrom rest_framework.generics import ListCreateAPIView class MyListCreateView(ListCreateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 结合了
-
RetrieveUpdateAPIView
:- 结合了
RetrieveAPIView
和UpdateAPIView
。 - 默认实现了
get
、put
和patch
方法。
pythonfrom rest_framework.generics import RetrieveUpdateAPIView class MyRetrieveUpdateView(RetrieveUpdateAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 结合了
-
RetrieveDestroyAPIView
:- 结合了
RetrieveAPIView
和DestroyAPIView
。 - 默认实现了
get
和delete
方法。
pythonfrom rest_framework.generics import RetrieveDestroyAPIView class MyRetrieveDestroyView(RetrieveDestroyAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 结合了
-
RetrieveUpdateDestroyAPIView
:- 结合了
RetrieveAPIView
、UpdateAPIView
和DestroyAPIView
。 - 默认实现了
get
、put
、patch
和delete
方法。
pythonfrom rest_framework.generics import RetrieveUpdateDestroyAPIView class MyRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 结合了
3. 视图集(ViewSets)
视图集将多个视图逻辑组合在一起,通常与路由器(Router)一起使用,自动生成 URL 配置。
常用类
-
ViewSet
:- 类似于
APIView
,但将多个操作(如list
、create
、retrieve
等)组合在一起。 - 需要手动实现各个操作。
pythonfrom rest_framework import viewsets from rest_framework.response import Response class 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 操作。 - 适合标准的模型操作。
pythonfrom rest_framework import viewsets class MyModelViewSet(viewsets.ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 继承自
-
ReadOnlyModelViewSet
:- 继承自
ModelViewSet
,但只提供只读操作(list
和retrieve
)。
pythonfrom rest_framework import viewsets class MyReadOnlyViewSet(viewsets.ReadOnlyModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
- 继承自
4. 其他视图类
-
GenericViewSet
:- 结合了
GenericAPIView
和ViewSet
的功能。 - 通常与
@action
装饰器一起使用,定义自定义操作。
pythonfrom rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response class 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
实现高级功能的场景。