Loading

基于视图集实现接口

基于视图集实现接口

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
posted @ 2022-10-24 17:24  minqiliang  阅读(103)  评论(0编辑  收藏  举报
-->