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())

 

 

 

posted @ 2022-01-04 15:46  hushowee  阅读(139)  评论(0)    收藏  举报