Django-rest-framework中的五種 ModelMixin 類詳解

一. 創建數據類 CreateModelMixin :

class CreateModelMixin:
    """
    1. 接收前臺數據,前天的序列化對象,request.data是 QueryDict
    如:<QueryDict: {'nickName': ['006'], 'item': ['運營數據可視化'], 'url': ['#']}>
    2. 驗證序列化數據的有效性
    3. 保存數據
    4. 獲得請求頭
    5. 返回狀態
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}

 

二。返回所有數據列表 ListModelMixin:

class ListModelMixin:
    """
    1. 獲取 queryset ,通過 filter_queryset 進行過濾篩選
    2. 對過濾篩選後的 queryset 進行分頁,返回分頁對象
    3. 序列化,並返回序列化的數據
    傳入一個queryset,分別過濾,分頁,序列化
    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)

 

三。傳入參數,返回某個數據對象 RetrieveModelMixin:

class RetrieveModelMixin:
    """
    獲取對象,序列化
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

四。 傳入參數,更新數據對象 UpdateModelMixin:

class UpdateModelMixin:
    """
    更新:
    1. 獲取 kwargs 字典中 partial 的值,如果沒有,則返回False,有,則返回值
    2. 獲取單個對象
    3. 通過序列化,獲取單個對象的序列化對象
    4. 判斷序列化對象的有效性
    5. 更新數據
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

 

五。傳入參數,刪除某個數據對象 DestroyModelMixin

class DestroyModelMixin:
    """
    刪除:
    1. 獲取單個對象
    2. 刪除對象
    Destroy a model instance.
    """
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章