Django-drf-路由
路由的三种配置方法
1、常规写法
urlpatterns = [# 常规写法 path('book/', views.BookAPIView.as_view()), # 不带id的 re_path('book/(?P<pk>\d+)', views.BookDetailAPIVIew.as_view()), # 带id,通过有名分组,匹配数字,分组名为pk,与视图函数的形参对应 ]
2、继承了ViewSetMixin的写法
直接继承了ViewSetMixin或继承的类中,间接的继承了ViewSetMixin都这样写
urlpatterns = [ # 视图集合 path('book/', views.BookAPIView.as_view(actions={'get': 'list', 'post': 'create'})), re_path('book/(?P<pk>\d+)', views.BookAPIView.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), ]
3、使用router模块,自动生成
这种方式,只适用于继承了ViewSetMixin或间接继承了ViewSetMixin的视图类
常用的是SimpleRooter,点到SImpleRooter的源码去,router模块在内部做了映射,get--list 、 post--create,如果是继承了ModelViewSet的话,那么常用的都有,无需在路由中去指定,只有自定义的一些方法需要通过action装饰器去指定
常规使用
# 1 导入SimpleRooter或DefaultRooter,DefaultRooter生成的路由会多一些,可以指定生成的格式(如http://localhost:8080/a.json)和直接访问根不在报错,其他没区别 from rest_framework.routers import SimpleRouter # 2 实例化 router = SimpleRouter() # 3 注册视图类 router.register('book',views.BookAPIView) # 不用带斜线,如这里写了前缀,路由分发哪里也写了前缀,那么访问方式就是 http://localhost:8000/book/book/xxx # 4 和常规路由合并 # urlpatterns+=router.urls # 可以通过include路由分发 path('book/',include(router.urls)) # 斜线要带上
自定义方法的路由配置
若ModelViewSet提供的方法不能满足业务需求,就需要再去视图函数,若是继承了视图集的话,那么路由就需要通过action装饰器去指定
class BookAPIView(ModelViewSet): queryset = models.Book.objects.all() serializer_class = serializer.BookModelSerializer @action(methods=['get'],detail=False) def get_2(self,request,*args,**kwargs): book_list = self.get_queryset()[:2] book_ser = serializer.BookModelSerializer(book_list,many=True) return Response(book_ser.data)
# 可以在urls.py中打印生成的路由
# print(router.get_urls())
浙公网安备 33010602011771号