django之DRF的views.py实现方式概览
Django 的视图实现方式主要有两种:FBA(Function-Based Views,函数视图) 和 CBA(Class-Based Views,类视图)。 而在 Django REST Framework(DRF)中,视图的实现方式更加丰富和灵活,主要包括以下几种: 1. Django 的视图实现方式 (1) FBA(Function-Based Views) 函数视图是基于函数的视图,适合简单的逻辑处理。 from django.http import HttpResponse def my_view(request): if request.method == 'GET': return HttpResponse('Hello, GET request!') elif request.method == 'POST': return HttpResponse('Hello, POST request!') (2) CBA(Class-Based Views) 类视图是基于类的视图,适合复杂的逻辑处理,支持代码复用和扩展。 from django.views import View from django.http import HttpResponse class MyView(View): def get(self, request): return HttpResponse('Hello, GET request!') def post(self, request): return HttpResponse('Hello, POST request!') 2. DRF 的视图实现方式 DRF 在 Django 的基础上提供了更强大的视图实现方式,主要用于构建 RESTful API。以下是 DRF 中常见的视图实现方式: (1) APIView APIView 是 DRF 中最基础的类视图,类似于 Django 的 View,但提供了更多的功能(如请求解析、响应渲染、异常处理等)。 from rest_framework.views import APIView from rest_framework.response import Response class MyAPIView(APIView): def get(self, request): return Response({'message': 'Hello, GET request!'}) def post(self, request): return Response({'message': 'Hello, POST request!'}) (2) GenericAPIView GenericAPIView 是 APIView 的扩展,提供了更多的通用功能(如获取单个对象、获取对象列表等),通常与 Mixin 类一起使用。 from rest_framework.generics import GenericAPIView from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from .models import MyModel from .serializers import MyModelSerializer class MyGenericView(ListModelMixin, RetrieveModelMixin, GenericAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) (3) ViewSet ViewSet 是 DRF 中更高级的视图实现方式,它将多个视图逻辑(如列表、详情、创建、更新、删除等)组合到一个类中。ViewSet 通常与路由器(Router)一起使用,自动生成 URL 配置。 ModelViewSet ModelViewSet 是 ViewSet 的子类,提供了完整的 CRUD 操作。 from rest_framework.viewsets import ModelViewSet from .models import MyModel from .serializers import MyModelSerializer class MyModelViewSet(ModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer ReadOnlyModelViewSet ReadOnlyModelViewSet 是 ModelViewSet 的子类,只提供只读操作(列表和详情)。 from rest_framework.viewsets import ReadOnlyModelViewSet from .models import MyModel from .serializers import MyModelSerializer class MyReadOnlyViewSet(ReadOnlyModelViewSet): queryset = MyModel.objects.all() serializer_class = MyModelSerializer 自定义 ViewSet 你可以通过继承 ViewSet 或 GenericViewSet 来实现自定义逻辑。 from rest_framework.viewsets import ViewSet from rest_framework.response import Response class MyCustomViewSet(ViewSet): def list(self, request): return Response({'message': 'Hello, list action!'}) def retrieve(self, request, pk=None): return Response({'message': f'Hello, retrieve action for pk={pk}!'}) (4) 路由器(Router) DRF 提供了路由器(Router)来自动生成 ViewSet 的 URL 配置。 from rest_framework.routers import DefaultRouter from .views import MyModelViewSet router = DefaultRouter() router.register(r'mymodels', MyModelViewSet) urlpatterns = router.urls 3. 推荐使用哪种方式? (1) 简单场景 如果逻辑简单,可以直接使用 APIView 或函数视图。 (2) 标准 CRUD 操作 如果需要对模型进行标准的 CRUD 操作,推荐使用 ModelViewSet,因为它可以快速生成完整的 API。 (3) 复杂逻辑 如果需要自定义逻辑,可以使用 ViewSet 或 GenericAPIView,结合 Mixin 类实现灵活的功能。 (4) 只读 API 如果只需要提供只读 API,可以使用 ReadOnlyModelViewSet。 (5) 代码复用 如果需要复用代码,推荐使用 GenericAPIView 和 Mixin 类。 4. ViewSet 的优势 代码简洁:将多个视图逻辑组合到一个类中,减少代码量。 自动 URL 配置:通过路由器自动生成 URL 配置,减少手动配置的工作量。 标准化:提供标准的 CRUD 操作,适合快速开发 RESTful API。