基于视图集实现接口
基于视图集实现接口
12.1 视图集的简介
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。
视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。如:
class BookInfoViewSet(viewsets.ViewSet):
def list(self, request):
...
def retrieve(self, request, pk=None):
...
在设置路由时,我们可以如下操作
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]
12.2 常用视图集父类
(1) ViewSet
继承自APIView
,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
(2)GenericViewSet
继承自GenericAPIView
,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
(3)ModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
(4)ReadOnlyModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin。
12.3 视图集的使用
视图
"""使用视图集"""
from rest_framework.viewsets import ReadOnlyModelViewSet, ModelViewSet
class StudentReadOnlyModelViewSet(ReadOnlyModelViewSet, CreateModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = studentsInfo.objects.all()
serializer_class = StudentModelSerializer
class StudentModelViewset(ModelViewSet):
queryset = studentsInfo.objects.all()
serializer_class = StudentModelSerializer
两个视图拥有相同的功能,但是使用不同的视图集实现的。
路由
from django.urls import path, re_path
from . import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("students6", views.StudentModelViewset, basename="students6")
urlpatterns = [
# APIView
path('students/', views.StudentView.as_view()),
re_path(r'^students/(?P<pk>\d+)/$', views.StudentAPIView.as_view()),
# GenericAPIView
path('students2/', views.StudentGenericAPIView.as_view()),
re_path(r'^students2/(?P<pk>\d+)/$', views.StudentGenericAPIView2.as_view()),
# GenericAPIView和mixin
path('students3/', views.StudentGenericAPIViewMixin.as_view()),
re_path(r'^students3/(?P<pk>\d+)/$', views.StudentGenericAPIViewMixin2.as_view()),
# GenericAPIView和mixin
path('students4/', views.StudentView1.as_view()),
re_path(r'^students4/(?P<pk>\d+)/$', views.StudentView2.as_view()),
# 视图集 ReadOnlyModelViewSet,此种方法比较麻烦,只是为了了解
path('students5/', views.StudentReadOnlyModelViewSet.as_view(
{
"get": "list",
"post": "create"
}
)),
re_path(r'^students5/(?P<pk>\d+)/$', views.StudentReadOnlyModelViewSet.as_view({
"get": "retrieve",
"put": "update",
"delete": "destroy",
})),
] + router.urls