选择使用通用视图(Generic Views)或视图集(ViewSets)

在Django REST Framework中,通用视图视图集都可以用于快速构建REST API。它们各自有不同的适用场景,下面将详细介绍如何在两者之间进行选择。

通用视图(Generic Views)

通用视图提供了一些常用的、独立的视图类,如 ListCreateAPIViewRetrieveUpdateDestroyAPIView 等,用于处理增删改查中的某一种或某几种功能,适合在以下情况使用:

  • 仅需要部分功能:例如,只有列表和创建操作,或只需要更新和删除操作。
  • 视图逻辑较为简单:如果你的视图只负责一种单一的操作(如列出所有数据,或者检索单个对象),通用视图就非常合适。
  • 对自定义需求较高:通用视图易于调整和扩展,当你需要对特定请求类型进行精细控制时,使用通用视图能让代码结构更清晰。

示例代码

views.py 中定义两个通用视图:

from rest_framework import generics
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

urls.py 中手动配置路由:

from django.urls import path
from .views import SnippetList, SnippetDetail

urlpatterns = [
    path('snippets/', SnippetList.as_view(), name='snippet-list'),          # 用于列出和创建
    path('snippets/<int:pk>/', SnippetDetail.as_view(), name='snippet-detail'),  # 用于检索、更新和删除
]

视图集(ViewSets)

视图集将多个视图逻辑(如列出、创建、检索、更新、删除)组合在一个类中。适合以下情况:

  • 需要完整的CRUD功能:如果API端点需要支持所有的增删改查功能,使用视图集会更简洁高效。
  • RESTful API风格的规范路由:使用 router 可以自动生成规范的RESTful路由,简化代码。
  • 代码简洁且重用性高:视图集可以大大减少视图代码数量,并通过配置 router 实现自动化路由。

示例代码

views.py 中定义一个视图集:

from rest_framework import viewsets
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

urls.py 中使用 router 自动生成路由:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import SnippetViewSet

router = DefaultRouter()
router.register(r'snippets', SnippetViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

如何选择?

  • 如果只需要部分API操作,例如只需要列表和创建,或只需要检索和更新,那么选择通用视图
  • 如果需要完整的CRUD操作且希望使用自动化路由,选择视图集,因为视图集将所有CRUD操作合并在一起,同时结合router可以生成RESTful风格的路由。
  • 自定义需求较多时,使用通用视图有助于更细致地控制不同请求的处理逻辑;而对于较简单的CRUD功能,视图集提供了更便捷的代码组织方式。

以上是通用视图和视图集的基本适用场景及代码示例。

posted @ 2024-11-18 13:03  林汉州win  阅读(5)  评论(0编辑  收藏  举报