restframework视图集的和自动生成路由

视图集的作用

当一个模型对应多个操作,例如获取单条学生数据和获取所有学生数据。
    如果不使用视图集使用普通视图一个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

测试

 

 

 

posted on 2021-07-07 23:48  信奉上帝的小和尚  阅读(62)  评论(0编辑  收藏  举报

导航