from django.conf.urls import include
from rest_framework.routers import SimpleRouter
router = SimpleRouter() # SimpleRouter类内部做了{请求:函数}的映射关系
# 所有路由与ViewSet视图类的都可以注册,会产生 '^v6/books/$' 和 '^v6/books/(?P<pk>[^/.]+)/$'
router.register('v6/books', views.BookModelViewSet)
urlpatterns = [
# 第一种添加子列表方式
url(r'^', include(router.urls)),
]
# 第二种添加子列表方式
# urlpatterns.extend(router.urls)
SimpleRouter 源码:
class SimpleRouter(BaseRouter):
# 没有 pk 时做的映射关系
routes = [
# List route.
Route(
url=r'^{prefix}{trailing_slash}$', # 没有pk
# 映射关系
mapping={
'get': 'list',
'post': 'create'
},
name='{basename}-list',
detail=False,
initkwargs={'suffix': 'List'}
),
# 有 pk 时做的映射关系
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$', # 有pk
# 映射关系
mapping={
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
},
name='{basename}-detail',
detail=True,
initkwargs={'suffix': 'Instance'}
),
# 1 导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# DefaultRouter生成的路由更多一点,多了一个根的路由(没有用)
# 2 实例化得到对象
router = SimpleRouter()
router.register('books', views.BookView)
router.register('publish', views.PublishView)
# print(router.urls) # 自动生成的路由
urlpatterns = [
# 3 注册路由 把自动生成的路径加入到urlpatterns
path('api/v1/', include(router.urls)),
]
# 4 把自动生成的路径加入到urlpatterns
urlpatterns+=router.urls
总结:ViewSetMixin+9个视图子类才能用自动生成路由
action装饰器
在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
methods: 声明该action对应的请求方式,列表传递
detail: 声明该action的路径是否与单一资源对应,及是否是xxx/<pk>/action方法名/
True 表示路径格式是xxx/<pk>/action方法名/
False 表示路径格式是xxx/action方法名/
1 作用:给自动生成路由的视图类再定制一些路由
class test(viewsets.ModelViewSet):
2 用法一:
# api/v1/publish/sen_email/
@action(methods=['GET'], detail=False)
def sen_email(self, request, *args, **kwargs):
print(args)
print(kwargs)
return APIResponse(msg='发送成功')
3 方法二:
# api/v1/publish/10/sen_email/
@action(methods=['GET'], detail=True)
def sen_email(self, request, *args, **kwargs):
# pk=10
print(args)
print(kwargs)
return APIResponse(msg='发送成功')