在Django REST Framework中,通用视图和视图集都可以用于快速构建REST API。它们各自有不同的适用场景,下面将详细介绍如何在两者之间进行选择。
通用视图(Generic Views)
通用视图提供了一些常用的、独立的视图类,如 ListCreateAPIView
、RetrieveUpdateDestroyAPIView
等,用于处理增删改查中的某一种或某几种功能,适合在以下情况使用:
- 仅需要部分功能:例如,只有列表和创建操作,或只需要更新和删除操作。
- 视图逻辑较为简单:如果你的视图只负责一种单一的操作(如列出所有数据,或者检索单个对象),通用视图就非常合适。
- 对自定义需求较高:通用视图易于调整和扩展,当你需要对特定请求类型进行精细控制时,使用通用视图能让代码结构更清晰。
示例代码
在 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功能,视图集提供了更便捷的代码组织方式。
以上是通用视图和视图集的基本适用场景及代码示例。
标签:通用,或视,Views,视图,路由,router,import,图集 From: https://www.cnblogs.com/win1998/p/18517452