視圖組件匾旭、路由組件

一镣屹、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è)
image.png

五愿吹、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)系圖

image.png

七耘拇、路由的使用

自動(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的路由生成的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扔役,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子警医,更是在濱河造成了極大的恐慌亿胸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预皇,死亡現(xiàn)場(chǎng)離奇詭異侈玄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吟温,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門序仙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鲁豪,你說(shuō)我怎么就攤上這事潘悼。” “怎么了爬橡?”我有些...
    開(kāi)封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵挥等,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堤尾,道長(zhǎng),這世上最難降的妖魔是什么迁客? 我笑而不...
    開(kāi)封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任郭宝,我火速辦了婚禮辞槐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粘室。我一直安慰自己榄檬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布衔统。 她就那樣靜靜地躺著鹿榜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锦爵。 梳的紋絲不亂的頭發(fā)上舱殿,一...
    開(kāi)封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音险掀,去河邊找鬼沪袭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛樟氢,可吹牛的內(nèi)容都是我干的冈绊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼埠啃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼死宣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碴开,我...
    開(kāi)封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毅该,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后叹螟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鹃骂,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年罢绽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏线。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡良价,死狀恐怖寝殴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情明垢,我是刑警寧澤蚣常,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站痊银,受9級(jí)特大地震影響抵蚊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一贞绳、第九天 我趴在偏房一處隱蔽的房頂上張望谷醉。 院中可真熱鬧,春花似錦冈闭、人聲如沸俱尼。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遇八。三九已至,卻和暖如春耍休,著一層夾襖步出監(jiān)牢的瞬間刃永,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工羹应, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揽碘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓园匹,卻偏偏與公主長(zhǎng)得像雳刺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裸违,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355