Rest-framework專欄講解(三):Generic view

MedusaSorcerer的博客


點擊跳轉到 Rest-Framework 專欄目錄

GenericAPIView

瞭解到 APIView 以後, 你能夠嘗試看下 GenericAPIView 的源碼, 導入路徑是:python

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
複製代碼

在源碼中能夠看到他是在 APIView 的一種拓展, 當你繼承這個視圖類撰寫自定義視圖的時候, 你能夠獲取如下幾個屬性:函數

  • queryset:用於從該視圖返回查詢集對象, 必須設置此屬性或重寫 get_queryset() 方法, 若是要覆蓋視圖方法, 則必須進行調用 get_queryset() 而不是直接訪問此屬性
  • serializer_class:用於驗證輸入和反序列化輸出的序列化類, 必須設置此屬性或重寫 get_serializer_class() 方法。
  • lookup_field:用於執行單個模型實例的對象查找的模型字段, 默認爲 pk
  • lookup_url_kwarg:用於對象查找的URL關鍵字參數
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAdminUser

from models import User


class MedusaSerializer(serializers.Serializer):
    ...


class MedusaView(GenericAPIView):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

固然, 可能在 APIView 上拓展了一些方法放咱們的 API 撰寫變得簡單, 而且富有規範性, 可是相比較而言, 他的存在更加推薦和 mixins 一塊兒使用,post

  • perform_create(self, serializer) - CreateModelMixin 保存新對象實例時調用
  • perform_update(self, serializer) - UpdateModelMixin 保存現有對象實例時調用
  • perform_destroy(self, instance) - DestroyModelMixin 刪除對象實例時調用

例如你在新建實例對象進行保存處理的時候還須要作其餘的處理, 你就能夠在 perform_create(self, serializer) 中對它進行重寫:url

def perform_create(self, serializer):
    instance = serializer.save()
    
    # 你須要作的其餘處理的函數, 或者代碼塊
    ...
複製代碼

你也能夠對更新的數據進行再次驗證, 引起 ValidationError() 異常:spa

def perform_update(self, serializer):
    if 1 == 1:
        raise ValidationError('我無論,我就是不讓你更新。')
    serializer.save(user=self.request.user)
複製代碼

固然啦, 還有 ListModelMixin 來獲取數據集合的, RetrieveModelMixin 來獲取某一數據詳情的, 大多數的請求方式和請求內容都已經歸納了。rest

ListModelMixin

提供了 .list(request, *args, **kwargs) 方法, 用於查詢對象集合, 你也能夠重寫他的 list 方法實現你本身的返回體, 你也能夠對他進行數據分頁(分頁 將會在之後講解到), 當你查詢成功了, 將會返回 200 OK 的狀態碼給你:code

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAdminUser


class MedusaView(GenericAPIView, ListModelMixin):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

CreateModelMixin

提供 .create(request, *args, **kwargs) 方法, 該方法實現建立並保存模型的新實例對象, 若是成功建立對象則返回一個 201 Created 響應, 若是提供的用於建立對象的請求數據無效, 則會返回一個 400 Bad Request 響應, 並將錯誤詳細信息做爲響應的正文。orm

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin
from rest_framework.permissions import IsAdminUser


class MedusaView(GenericAPIView, CreateModelMixin):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

RetrieveModelMixin

提供 .retrieve(request, *args, **kwargs) 方法, 該方法實如今響應中返回現有模型實例的詳情數據, 若是能夠檢索到對象, 則返回一個 200 OK 響應, 不然將返回 404 Not Foundcdn

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import IsAdminUser


class MedusaView(GenericAPIView, RetrieveModelMixin):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

UpdateModelMixin

提供 .update(request, *args, **kwargs) 方法, 該方法實現更新並保存現有模型的實例, 還提供了一種 .partial_update(request, *args, **kwargs) 方法, 該方法與該 update 方法相似, 可是用於更新的全部字段都是可選的, 這樣能夠支持 HTTP PATCH 請求(做者在實際開發中, 會對 UpdateModelsMixin 從新定義, 刪除對 HTTP PATCH 請求方式的支持), 若是對象被更新, 它將返回一個 200 OK 響應, 若是提供的用於更新對象的請求數據無效, 則會返回 400 Bad Request 響應, 並將錯誤詳細信息做爲響應的主體。對象

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from rest_framework.permissions import IsAdminUser


class MedusaView(GenericAPIView, UpdateModelMixin):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

DestroyModelMixin

提供 .destroy(request, *args, **kwargs) 方法, 該方法實現刪除現有模型實例, 若是刪除對象成功則返回 204 No Content 響應, 不然將返回 404 Not Found

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import DestroyModelMixin
from rest_framework.permissions import IsAdminUser


class MedusaView(GenericAPIView, DestroyModelMixin):
    queryset = User.objects.all()
    serializer_class = MedusaSerializer
    permission_classes = [IsAdminUser]
複製代碼

組合的視圖類

  • CreateAPIView
    用於僅建立新模型實例對象的視圖
    提供 POST 請求方式
    依賴:GenericAPIView, CreateModelMixin
  • ListAPIView
    用於僅只讀模型實例對象集合數據的視圖
    提供 GET 請求方式
    依賴:GenericAPIView, ListModelMixin
  • RetrieveAPIView
    用於僅只讀單個模型實例對象的視圖
    提供 GET 請求方式
    依賴:GenericAPIView, RetrieveModelMixin
  • DestroyAPIView
    用於僅刪除單個模型實例對象的視圖
    提供 DELETE 請求方式
    依賴:GenericAPIView, DestroyModelMixin
  • UpdateAPIView
    用於僅對已有模型實例進行修改的視圖
    提供 PUTPATCH 請求方式
    依賴:GenericAPIView, UpdateModelMixin
  • ListCreateAPIView
    用於對模型實例對象集讀取和寫入的視圖
    提供 GETPOST 請求方式
    依賴:GenericAPIView, ListModelMixin, CreateModelMixin
  • RetrieveUpdateAPIView
    用於對單個模型實例的讀取和更新的視圖
    提供 GETPUTPATCH 請求方式
    依賴:GenericAPIView, RetrieveModelMixin, UpdateModelMixin
  • RetrieveDestroyAPIView
    用於對單個模型實例的讀取和刪除的視圖
    提供 GETDELETE 請求方式
    依賴:GenericAPIView, RetrieveModelMixin, DestroyModelMixin
  • RetrieveUpdateDestroyAPIView
    用於對單個模型實例的讀取、更新和刪除的視圖
    提供 GETPUTPATCHDELETE 請求方式
    依賴:GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
相關文章
相關標籤/搜索