路由组件
路由组件
自动生成路由的几个步骤
第一步:导入路由组件(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/