drf自动生成路由的方法
drf自动生成路由一共分为五个步骤,导入路由类,实例化得到对象,注册路由,添加前缀,将自动生成的路由添加到urlpatterns中。
# 导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# 实例化得到对象
router = SimpleRouter()
# 册路由
router.register('books', views.BookView)
# 把自动生成的路径加入到urlpatterns
(1) 方案1
urlpatterns = [
path('api/v1/', include(router.urls))
]
(2) 方案2
urlpatterns+=router.urls
------------------------------自动生成的路由的样式------------------------------
path('books/', views.BookView.as_view({'get': 'list', 'post': 'create'})),
path('books/<int:pk>', views.BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
- 重点强调
继承哪ViewSetMixin+9个视图字类的视图类才能用自动生成路由
-
action装饰器
给自动生成路由的视图类再定制一些路由,使用方法如下
方法一:
# api/v1/books/send_email/
@action(methods=['GET','POST'], detail=False,url_path='mail')
def sen_email(self, request, *args, **kwargs):
print(args)
print(kwargs)
return APIResponse(msg='发送成功')
# api/v1/books/mail/
@action(methods=['GET','POST'], detail=False,url_path='mail') # url_path的作用是起别名
方法二:
# api/v1/books/10/send_email/
@action(methods=['GET'], detail=True) # 针对某个对象进行操作就采用datail=True的方式,不是就为False的方式
def sen_email(self, request, *args, **kwargs):
# pk=10
print(args) # ()
print(kwargs) # {'pk':'10'}
return APIResponse(msg='发送成功')