路由组件

路由组件

自动生成路由的几个步骤

第一步:导入路由组件(SimpleRouter、DefaultRouter)

  • SimpleRouter:生成两条路由

    '''
    api/day04/ ^students/$ [name='student-list']
    api/day04/ ^students/(?P<pk>[^/.]+)/$ [name='student-detail']
    '''
    # 导入路由组件
    from rest_framework.routers import SimpleRouter
    
  • DefaultRouter:生成的路由更多

    '''
    api/day04/ ^students/$ [name='student-list']
    api/day04/ ^students/(?P<pk>[^/.]+)/$ [name='student-detail']
    
    api/day04/ ^students\.(?P<format>[a-z0-9]+)/?$ [name='student-list']
    http://127.0.0.1:8000/api/day04/students.json/
    api/day04/ ^students/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='student-detail']
    http://127.0.0.1:8000/api/day04/students/2.json/
    
    api/day04/ ^$ [name='api-root'] 根,根路径会显示出所有可以访问的地址
    api/day04/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
    '''
    # 导入路由组件
    from rest_framework.routers import DefaultRouter
    

第二步:实例化类生成路由对象

# SimpleRouter
router = SimpleRouter()

# DefaultRouter
router = DefaultRouter()

第三步:注册路由

# SimpleRouter
router.register('前缀', 继承了ModelViewSet的视图类)

# DefaultRouter
router.register('students', 继承了ModelViewSet的视图类)

第四步:拼接路由列表

# urls.py
urlpatterns = []
urlpatterns += router.urls

action的使用步骤

第一步:先导入action装饰器

from rest_framework.decorators import action

第二步:给视图类的方法添加action装饰器

  • methods:是一个列表,列表中放请求方式,只有在列表中的请求方式才能够执行该方法
  • detail:布尔值,默认是False,当他为True时就会自动生成传参的路由(带pk),False就是自动生成没有参数的路由(不带pk)
class StuModelViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StuModelSerializer
    @action(['GET', 'post'], detail=False)
    def my_get(self, request):
        # 获取前十条数据
        obj_list = self.get_queryset()[:10]
        serializer = self.get_serializer(obj_list, many=True)
        return Response(serializer.data)

此处有个坑,当我们直接设置queryset = Student.objects时会报错,这是因为我们无法直接对Manager对象进行切片操作,而是需要将它转化成QuerySet对象才能进行切片操作,所以此处因该设置queryset = Student.objects.all()加上.all()让它变成一个QuerySet对象

第三步:访问路由

# detail=False
api/day04/ ^students/my_get/$ [name='student-my-get']
# http://127.0.0.1:8000/api/day04/students/my_get/

# detail=True
api/day04/ ^students/(?P<pk>[^/.]+)/my_get/$ [name='student-my-get']
# http://127.0.0.1:8000/api/day04/students/1/?my_get/
posted @ 2020-07-09 18:46  群青-Xi  阅读(205)  评论(0编辑  收藏  举报