Django(56)Mixins工具集的使用

Silent丿丶黑羽 發表於 2021-06-10

前言

mixins翻譯成中文是混入,元件的意思。在DRF中,針對獲取列表,檢索,建立等操作,都有相應的mixin,一般我們自定義建立的類檢視都會繼承自GenericAPIViewMixins一起使用
 

mixins工具集

mixins.py檔案中有5個類,分別是

  • CreateModelMixin:類中有個create方法,相當於單增
  • ListModelMixin:類中有個list方法,相當於群查
  • RetrieveModelMixin:類中有個`retrieve方法,相當於單查
  • UpdateModelMixin:類中有個updatepartial_update2個方法,相當於單整體改和單區域性改
  • DestroyModelMixin:類中有個destroy方法,相當於單刪

接下來我們自定義檢視類,繼承自這5個工具類和GenericAPIView

from rest_framework import mixins
from rest_framework.generics import GenericAPIView


class StudentsGenericView(mixins.ListModelMixin, mixins.CreateModelMixin,
                          mixins.RetrieveModelMixin, mixins.UpdateModelMixin,
                          mixins.DestroyModelMixin, GenericAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    
    # 單查
    def get(self, request, *args, **kwargs):
        pk = kwargs.get("pk")
        if pk:
            response = self.retrieve(request, *args, **kwargs)
        else:
            response = self.list(request, *args, **kwargs)
        return APIResponse(results=response.data)
    
    # 單增
    def post(self, request, *args, **kwargs):
        response = self.create(request, *args, **kwargs)
        return APIResponse(results=response.data)
    
    # 單整體改
    def put(self, request, *args, **kwargs):
        response = self.update(request, *args, **kwargs)
        return APIResponse(results=response.data)

    # 單區域性改 
    def patch(self, request, *args, **kwargs):
        response = self.partial_update(request, *args, **kwargs)
        return APIResponse(results=response.data)

    # 單刪
    def delete(self, request, *args, **kwargs):
        response = self.destroy(request, *args, **kwargs)
        return APIResponse(results=response.data)

  以上我們通過繼承GenericAPIView,可以設定queryset以及serializer_class,那麼檢視函式就知道你是要針對哪個模型做處理,你的序列化的類是什麼了。接著我們繼承mixins的5個工具類,這樣StudentList就擁有了獲取列表,以及建立資料的功能。

以下方法由mixin類提供,並提供物件儲存或刪除行為的簡單重寫。

  • perform_create(self, serializer) - 在儲存新物件例項時由CreateModelMixin呼叫。
  • perform_update(self, serializer) - 在儲存現有物件例項時由 UpdateModelMixin 呼叫。
  • perform_destroy(self, instance) - 在刪除物件例項時由 DestroyModelMixin 呼叫。

這些鉤子對於設定請求中隱含的但不是請求資料的一部分的屬性特別有用。例如,你可以根據請求使用者或基於URL關鍵字引數在物件上設定屬性。

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

這些可重寫的關鍵點對於新增在儲存物件之前或之後發生的行為(例如通過電子郵件傳送確認或記錄更新日誌)也特別有用。

def perform_update(self, serializer):
    instance = serializer.save()
    send_email_confirmation(user=self.request.user, modified=instance)

你還可以使用這些鉤子通過丟擲 ValidationError() 來提供額外的驗證。當你需要在資料庫儲存時應用一些驗證邏輯時,這會很有用。 例如:

def perform_create(self, serializer):
    queryset = SignupRequest.objects.filter(user=self.request.user)
    if queryset.exists():
        raise ValidationError('You have already signed up')
    serializer.save(user=self.request.user)