自動生成路由 普通cbv視圖形式的路由: path('books4/', views.Book4View.as_view()), re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view()) 繼承了ViewSetMixin及其子類的視圖 ...
自動生成路由
普通cbv視圖形式的路由:
path('books4/', views.Book4View.as_view()),
re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view())
繼承了ViewSetMixin及其子類的視圖路由:
path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #當路徑匹配,又是get請求,會執行Book5View的list方法
re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
繼承自視圖類,ViewSetMixin及其子類的路由寫法(自動生成路由):
# 第一步:導入routers模塊
from rest_framework import routers
# 第二步:有兩個類,實例化得到對象
# routers.DefaultRouter 生成的路由更多,一般用第二種就行
# routers.SimpleRouter
router=routers.DefaultRouter()
# 第三步:註冊
# router.register('路由首碼','繼承自ModelViewSet視圖類','別名')
router.register('books',views.BookViewSet) # 不要加斜杠了
# 第四步
# router.urls # 自動生成的路由,加入到原路由中
# print(router.urls)
# urlpatterns+=router.urls
action裝飾器
導入:from rest_framework.decorators import action
# action乾什麼用?為了給繼承自ModelViewSet的視圖類中定義的函數也添加路由
# 使用
class BookViewSet(ModelViewSet):
queryset =Book.objects.all()
serializer_class = BookSerializer
# methods第一個參數,傳一個列表,列表中放請求方式,
# ^books/get_1/$ [name='book-get-1'] 當向這個地址發送get請求,會執行下麵的函數
# detail:布爾類型 如果是True
#^books/(?P<pk>[^/.]+)/get_1/$ [name='book-get-1']
@action(methods=['GET','POST'],detail=True)
def get_1(self,request,pk):
print(pk)
book=self.get_queryset()[:2] # 從0開始截取一條
ser=self.get_serializer(book,many=True)
return Response(ser.data)
# 裝飾器,放在被裝飾的函數上方,method:請求方式,detail:是否帶pk
# action里的其他參數:
url_path: 控制生成的/user/後的路徑是什麼,如果不寫,預設以方法名命名 /user/login/,一般跟函數名同名即可
url_name:別名,用於反向解析