Django(56)Mixins工具集的使用

前言

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)
Tags: