自動生成路由
普通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:別名,用于反向決議
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517525.html
標籤:Python
