一镣屹、2個(gè)視圖基類
1、Django Rest framework 提供的視圖主要作用
(1)控制序列化器的執(zhí)行(檢驗(yàn)价涝、保存女蜈、轉(zhuǎn)換數(shù)據(jù))
(2)控制數(shù)據(jù)庫(kù)查詢的執(zhí)行
2、APIView是REST framework提供的所有視圖基類色瘩,繼承自Django的View父類
APIView與View的不同之處在于:
(1)傳入到視圖方法中的是REST framework的Request對(duì)象伪窖,而不是Django的HttpRequeset對(duì)象;
(2)視圖方法可以返回REST framework的Response對(duì)象居兆,視圖會(huì)為響應(yīng)數(shù)據(jù)設(shè)置(render)符合前端要求的格式惰许;
(3)任何APIException異常都會(huì)被捕獲到,并且處理成合適的響應(yīng)信息史辙;
(4)在進(jìn)行dispatch()分發(fā)前,會(huì)對(duì)請(qǐng)求進(jìn)行身份認(rèn)證佩伤、權(quán)限檢查聊倔、流量控制。
3生巡、GenericAPIView(通用視圖類)
rest_framework.generics.GenericAPIView
繼承自APIVIew耙蔑,主要增加了操作序列化器和數(shù)據(jù)庫(kù)查詢的方法,作用是為下面Mixin擴(kuò)展類的執(zhí)行提供方法支持孤荣。通常在使用時(shí)甸陌,可搭配一個(gè)或多個(gè)Mixin擴(kuò)展類须揣。
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer # 指明視圖使用的序列化器
get_queryset:獲取配置的queryset
get_object:返回詳情視圖所需的模型類數(shù)據(jù)對(duì)象,路由中的分組字段必須是pk
get_serializer:獲取配置的序列化類
4钱豁、總結(jié)
APIView:如果跟models沒(méi)有關(guān)系(沒(méi)有數(shù)據(jù)庫(kù)相關(guān)操作)耻卡,就繼承它
GenericAPIView:有關(guān)數(shù)據(jù)庫(kù)操作,queryset 和
serializer_class
二牲尺、5個(gè)視圖擴(kuò)展類
1卵酪、作用:提供了幾種后端視圖(對(duì)數(shù)據(jù)資源進(jìn)行曾刪改查)處理流程的實(shí)現(xiàn),如果需要編寫的視圖屬于這五種谤碳,則視圖可以通過(guò)繼承相應(yīng)的擴(kuò)展類來(lái)復(fù)用代碼溃卡,減少自己編寫的代碼量。
這五個(gè)擴(kuò)展類需要搭配GenericAPIView父類蜒简,因?yàn)槲鍌€(gè)擴(kuò)展類的實(shí)現(xiàn)需要調(diào)用GenericAPIView提供的序列化器與數(shù)據(jù)庫(kù)查詢的方法瘸羡。
CreateModelMixin # create方法創(chuàng)建一條
DestroyModelMixin # destory方法刪除一條
ListModelMixin # list方法獲取所有
RetrieveModelMixin # retrieve獲取一條
UpdateModelMixin # update修改一條
三、9個(gè)子類視圖
CreateAPIView # 繼承CreateModelMixin,GenericAPIView搓茬,有post方法犹赖,新增數(shù)據(jù)
DestroyAPIView # 繼承DestroyModelMixin,GenericAPIView,有delete方法垮兑,刪除數(shù)據(jù)
ListAPIView # 繼承ListModelMixin,GenericAPIView,有g(shù)et方法獲取所有
UpdateAPIView # 繼承UpdateModelMixin,GenericAPIView冷尉,有put和patch方法,修改數(shù)據(jù)
RetrieveAPIView # 繼承RetrieveModelMixin,GenericAPIView系枪,有g(shù)et方法雀哨,獲取一條
CreateAPIView # 繼承CreateModelMixin,GenericAPIView,有post方法私爷,新增數(shù)據(jù)
DestroyAPIView # 繼承DestroyModelMixin,GenericAPIView雾棺,有delete方法,刪除數(shù)據(jù)
ListAPIView # 繼承ListModelMixin,GenericAPIView,有g(shù)et方法獲取所有
UpdateAPIView # 繼承UpdateModelMixin,GenericAPIView衬浑,有put和patch方法捌浩,修改數(shù)據(jù)
RetrieveAPIView # 繼承RetrieveModelMixin,GenericAPIView,有g(shù)et方法工秩,獲取一條
ListCreateAPIView # 繼承ListModelMixin,CreateModelMixin,GenericAPIView尸饺,有g(shù)et獲取所有,post方法新增
RetrieveDestroyAPIView # 繼承RetrieveModelMixin,DestroyModelMixin,GenericAPIView助币,有g(shù)et方法獲取一條浪听,delete方法刪除
RetrieveUpdateAPIView # 繼承RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有g(shù)et獲取一條眉菱,put迹栓,patch修改
RetrieveUpdateDestroyAPIView # 繼承RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView,有g(shù)et獲取一條俭缓,put克伊,patch修改酥郭,delete刪除
#views.py
from rest_framework.generics import ListAPIView,CreateAPIView,ListCreateAPIView,RetrieveAPIView,DestroyAPIView,UpdateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView
class BookGenericView(ListAPIView,CreateAPIView,):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
class BookDetailGenericView(RetrieveAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
#urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^books/',views.BookAPIView.as_view()),
# url(r'books/(?P<pk>\d+)',views.BookDetailAPIView.as_view()),
url(r'^books_ger/$', views.BookGenericView.as_view()),
url(r'^books_ger/(?P<pk>\d+)', views.BookDetailGenericView.as_view())
]
#serializer.py
from app01 import models
from rest_framework import serializers
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
四、視圖集ViewSet
#views.py
from rest_framework.viewsets import ModelViewSet
class BookSetView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
#urls.py
url(r'^books_ger/$', views.BookSetView.as_view({'get':'list','post':'create'})),
url(r'^books_ger/(?P<pk>\d+)', views.BookSetView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
#ModelViewSet:繼承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
#GenericViewSet:繼承ViewSetMixin, generics.GenericAPIView
#ViewSetMixin:重寫了as_view
#ReadOnlyModelViewSet:繼承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet :只能用于查詢單個(gè)或多個(gè)
五愿吹、action的使用
#views.py
from rest_framework.viewsets import ViewSetMixin
class BookView(ViewSetMixin,APIView): # 只要繼承viewSetMixin類不从,視圖類中就會(huì)有個(gè)action,打印結(jié)果是lqz
def lqz(self,request,*args,**kwargs):
print(self.action)
return Response('lqz')
#urls.py
url(r'^books_mix/',views.BookView.as_view({'get':'lqz'})) # 路由配置
#ViewSetMixin以后只要繼承它洗搂,路由的配置就發(fā)生變化了消返,只需要寫映射即可
六、用pycharm找出繼承關(guān)系圖
七耘拇、路由的使用
自動(dòng)生成路由
#SimpleRouter
# DefaultRouter # 能訪問(wèn)到根路徑
#路由中
#繼承了ViewSetMixin的視圖類撵颊,以后寫路由,可以自動(dòng)生成
from rest_framework import routers
#實(shí)例化得到一個(gè)對(duì)象
router = routers.SimpleRouter()
#注冊(cè)路由
router.register('books',views.BookSetView)
urlpatterns = [
#方式二:re_path(r'^$',include(router.urls))
]
方式一:把自動(dòng)生成的路由配置到urlpatterns 中
urlpatterns += router.urls
#配置路由的方式
#1惫叛、最原始的
path('books/', views.BookAPIView.as_view()),
-ViewSetMixin的視圖類
#2倡勇、ViewSetMixin的視圖類
path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'}))
#3、自動(dòng)生成的
#action
#當(dāng)自動(dòng)生成路由的時(shí)候嘉涌,由于視圖類中還有其它方法妻熊,是無(wú)法自動(dòng)生成路由的
#解決方法是加上action裝飾器
from rest_framework.decorators import action
@action(methods=['get'],detail=False)
#methods:什么請(qǐng)求方式會(huì)觸發(fā)被裝飾函數(shù)的執(zhí)行
#detail:是True是基于帶id的路由生成的,如果是False仑最,是基于不帶id的路由生成的