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

GenericAPIViewAPIView 的扩展,提供了更多的通用功能(如获取单个对象、获取对象列表等),通常与 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

ModelViewSetViewSet 的子类,提供了完整的 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

ReadOnlyModelViewSetModelViewSet 的子类,只提供只读操作(列表和详情)。

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

你可以通过继承 ViewSetGenericViewSet 来实现自定义逻辑。

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) 复杂逻辑

  • 如果需要自定义逻辑,可以使用 ViewSetGenericAPIView,结合 Mixin 类实现灵活的功能。

(4) 只读 API

  • 如果只需要提供只读 API,可以使用 ReadOnlyModelViewSet

(5) 代码复用

  • 如果需要复用代码,推荐使用 GenericAPIView 和 Mixin 类。

4. ViewSet 的优势

  • 代码简洁:将多个视图逻辑组合到一个类中,减少代码量。
  • 自动 URL 配置:通过路由器自动生成 URL 配置,减少手动配置的工作量。
  • 标准化:提供标准的 CRUD 操作,适合快速开发 RESTful API。
分类: 标签: django python drf

评论

-- 评论已关闭 --

全部评论