视图集的作用
当一个模型对应多个操作,例如获取单条学生数据和获取所有学生数据。
如果不使用视图集使用普通视图一个get请求是无法对应多个函数的所以我们需要写两个视图类,比较麻烦。
如果我们使用视图集的时候我们可以创建多条路由用过方法映射的方式实现我们的需求。
看下面例子!
手动创建路由方法
视图部分
from rest_framework.viewsets import GenericViewSet, ViewSetMixin from rest_framework.response import Response # 使用视图集编写 class ViewSetTest(GenericViewSet): def getone(self, request, pk, *args, **kwargs): return Response(f'获取一条PK为{pk}的信息') def getall(self, request, *args, **kwargs): return Response('获取所有信息')
路由部分
# 手动编写路由的方式 from app01.views import ViewSetTest urlpatterns = [ # 填写method和方法的对应关机 path('all', ViewSetTest.as_view({'get': 'getall'})), re_path('one/(?P<pk>d+)', ViewSetTest.as_view({'get': 'getone'})) ]
测试
自动创建路由方式
视图部分
from rest_framework.viewsets import GenericViewSet, ViewSetMixin from rest_framework.response import Response from rest_framework.decorators import action # 使用视图集编写 class ViewSetTest(GenericViewSet): """ 当detail设置为True的时候 会自动生成类似re_path('one/(?P<pk>d+)', ViewSetTest.as_view({'get': 'getone'}))的路由 也就是带id的路由,名字必须叫pk """ @action(methods=['get'], detail=True) def getone(self, request, pk, *args, **kwargs): print(pk) return Response(f'获取一条PK为{pk}的信息') @action(methods=['get'], detail=False) def getall(self, request, *args, **kwargs): return Response('获取所有信息')
路由部分
# 自动创建路由 from rest_framework.routers import SimpleRouter from app01.views import ViewSetTest router = SimpleRouter() router.register('test', ViewSetTest, basename='test') urlpatterns += router.urls
测试