20、Django_rest framework_View類再次優(yōu)化(rest_framework.mixins)

痛點(diǎn)

經(jīng)過之前的過濾引擎愁拭、分頁引擎的學(xué)習(xí)后,會發(fā)現(xiàn)view視圖的代碼越來越多盏混,復(fù)用和維護(hù)又變得困難了。本次就想方法來解決這個(gè)痛點(diǎn)

一许赃、回顧views.py中馆类,關(guān)于project的代碼
1.1、5個(gè)方法乾巧,分為了兩個(gè)類來寫的原因
  • ProjectsList類:都是不需要id值的
    a.添加project信息的post方法
    b.獲取所有的project信息的get方法沟于。
  • ProjectDetail類:都是需要id值的
    a.根據(jù)id返回指定project信息的get方法
    b.根據(jù)id和傳來的信息,修改指定project信息的post方法
    c.根據(jù)id旷太,刪除指定project信息的delete方法
  • 所以urls.py中路由也是分開兩種:
urlpatterns = [
    path('projects/', views.ProjectsList.as_view()),
    path('projects/<int:pk>/', views.ProjectDetail())
]
二、 rest_framework.mixins
2.1供璧、rest_framework.mixins的幾個(gè)方法中的代碼實(shí)現(xiàn)邏輯,分別上面之前實(shí)現(xiàn)的方法的代碼實(shí)現(xiàn)邏輯一樣
  • ListModelMixin:無需id
    1.提供list(request, *args, **kwargs)方法
    2.獲取模型類已存在的列表數(shù)據(jù)(多條數(shù)據(jù))
    3.獲取成功金句,則返回200 OK

  • CreateModelMixin:無需id
    1.提供create(request, *args, **kwargs)方法
    2.創(chuàng)建新的模型實(shí)例數(shù)據(jù)(創(chuàng)建新的記錄)
    3.創(chuàng)建成功,則返回200 OK

  • RetrieveModelMixin:需id
    1.提供retrieve(request, *args, **kwargs)方法
    2.獲取已存在的詳情數(shù)據(jù)(一條)
    3.獲取成功违寞,則返回200 OK
    4.獲取失敗偶房,則返回404 Not Found
  • UpdateModelMixin:需id
    1.提供update(request, *args, **kwargs)方法,用于全部更新
    2.提供partial_update(request, *args, **kwargs)方法棕洋,用于部分更新,支持PATCH方法
    3.更新已存在的模型實(shí)例(更新一條)
    4.更新成功摄悯,則返回200 OK
    5.更新失敗,則返回 400 Bad Request
    6.如果不存在奢驯,則返回404 Not Found

  • DestroyModelMixin:需id
    1.提供destroy(request, *args, **kwargs)方法,用于刪除
    2.刪除一條已存在的數(shù)據(jù)(一條記錄)
    3.刪除成功撒遣,則返回200 OK
    4.刪除失敗管跺,則返回 404 Not Found

2.2、查看rest_framework的源碼豁跑,會發(fā)現(xiàn)mixins.ListModelMixin類的代碼和之前使用的獲取所有projecet信息的get方法一樣:
class ListModelMixin:    
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
2.3艇拍、優(yōu)化之前views.py中關(guān)于project的代碼
  • 1.類分別繼承所需要的mixins的方法(然后再繼承GenericAPIView
  • 2.方法內(nèi)的代碼都刪除,修改成調(diào)用對應(yīng)mixins的方法
    代碼如下:
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from rest_framework.generics import GenericAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import mixins

## 注意先繼承mixins的方法
class ProjectsList(mixins.ListModelMixin,
                   mixins.CreateModelMixin,
                   GenericAPIView):
    ordering_fields = ['name', 'leader']
    queryset =Projects.objects.all()
    serializer_class = ProjectModelSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'desc']

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
    def post(self, request,*args,**kwargs):
        return self.create(request, *args, **kwargs)


class ProjectDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    GenericAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer    
    def get(self, request, *args,**kwargs):
        return self.retrieve(request, *args, **kwargs)
    def put(self, request, *args,**kwargs):
        return self.update(request, *args, **kwargs)
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馏鹤,一起剝皮案震驚了整個(gè)濱河市娇哆,隨后出現(xiàn)的幾起案子勃救,更是在濱河造成了極大的恐慌,老刑警劉巖勃黍,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晕讲,死亡現(xiàn)場離奇詭異,居然都是意外死亡瓢省,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門摹量,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凝果,你說我怎么就攤上這事睦尽∑骶唬” “怎么了骂删?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵宁玫,是天一觀的道長。 經(jīng)常有香客問我欧瘪,道長,這世上最難降的妖魔是什么佛掖? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任芥被,我火速辦了婚禮,結(jié)果婚禮上拴魄,老公的妹妹穿的比我還像新娘。我一直安慰自己夏漱,他們只是感情好顶捷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布服赎。 她就那樣靜靜地躺著,像睡著了一般重虑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荔仁,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音乏梁,去河邊找鬼。 笑死卖毁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亥啦。 我是一名探鬼主播练链,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼届吁!你這毒婦竟也來了绿鸣?” 一聲冷哼從身側(cè)響起疚沐,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亮蛔,失蹤者是張志新(化名)和其女友劉穎擎厢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锉矢,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年循头,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卡骂。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缝左,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渺杉,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布是越,位于F島的核電站,受9級特大地震影響倚评,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜天梧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呢岗。 院中可真熱鬧,春花似錦敷燎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拄衰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘悉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工老赤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留制市,地道東北人抬旺。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓祥楣,卻偏偏與公主長得像汉柒,于是被迫代替她去往敵國和親责鳍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359