Django視圖擴展類

Django視圖擴展類

擴展類必須配合GenericAPIView使用擴展類內部的方法,在調用序列化器時,都是使用get_serializer前端

須要自定義getpost等請求方法,內部實現調用擴展類對應方法便可 。python

1、mixins的視圖子類

做用:數據庫

提供了幾種後端視圖(對數據資源進行曾刪改查)處理流程的實現,若是須要編寫的視圖屬於這五種,則視圖能夠經過繼承相應的擴展類來複用代碼,減小本身編寫的代碼量 。django

這五個擴展類須要搭配GenericAPIView父類,由於五個擴展類的實現須要調用GenericAPIView提供的序列化器與數據庫查詢的方法。後端

1.1 ListModelMixin

列表視圖擴展類,提供list(request, *args, **kwargs)方法快速實現列表視圖,返回200狀態碼。api

  1. 提供list方法,快速實現列表視圖
  2. 調用GenericAPIView設置好的結果集
  3. 調用GenericAPIView設置好的序列化器

Mixinlist()方法會對數據進行過濾和分頁。app

源代碼:iview

from rest_framework.mixins import ListModelMixin

class ListModelMixin(object):
    """
    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)

舉例:post

from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView

class BookListView(ListModelMixin, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self, request):
        return self.list(request)

1.2 CreateModelMixin

建立視圖擴展類,提供create(request, *args, **kwargs)方法快速實現建立資源的視圖,成功返回201狀態碼。fetch

  1. 提供create(request, *args, **kwargs)方法快速實現建立資源的視圖
  2. 實際建立功能由序列化的save方法完成
  3. save方法會去調用序列化器的create方法

若是序列化器對前端發送的數據驗證失敗,返回400錯誤。

源代碼:

from rest_framework.mixins import CreateModelMixin

class CreateModelMixin(object):
    """
    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 {}

1.3 RetrieveModelMixin

詳情視圖擴展類,提供retrieve(request, *args, **kwargs)方法,能夠快速實現返回一個存在的數據對象。

若是存在,返回200, 不然返回404。

源代碼:

from rest_framework.mixins import RetrieveModelMixin

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

舉例:

from rest_framework.mixins import RetrieveModelMixin
from rest_framework.generics import GenericAPIView

class BookDetailView(RetrieveModelMixin, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self, request, pk):
        return self.retrieve(request)

1.4 UpdateModelMixin

更新視圖擴展類,提供update(request, *args, **kwargs)方法

  1. 能夠快速實現更新一個存在的數據對象。
  2. 同時也提供partial_update(request, *args, **kwargs)方法,能夠實現局部更新。
  3. 內部更新功能調用序列化器的save方法
  4. save方法會調用序列化器的update方法

成功返回200,序列化器校驗數據失敗時,返回400錯誤。

源代碼:

from rest_framework.mixins import UpdateModelMixin

class UpdateModelMixin(object):
    """
    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)

1.5 DestroyModelMixin

刪除視圖擴展類,提供destroy(request, *args, **kwargs)方法,能夠快速實現刪除一個存在的數據對象。

成功返回204,不存在返回404。

源代碼:

from rest_framework.mixins import DestroyModelMixin

class DestroyModelMixin(object):
    """
    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()

使用GenericAPIView和視圖擴展類,實現api接口,代碼:

"""GenericAPIView結合視圖擴展類實現api接口"""
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixin

class Students2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin):
    # 本次視圖類中要操做的數據[必填]
    queryset = Student.objects.all()
    # 本次視圖類中要調用的默認序列化器[玄天]
    serializer_class = StudentModelSerializer

    def get(self, request):
        """獲取多個學生信息"""
        return self.list(request)

    def post(self,request):
        """添加學生信息"""
        return self.create(request)

from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView

class Student2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
    queryset = Student.objects.all()

    serializer_class = StudentModelSerializer

    # 在使用GenericAPIView視圖獲取或操做單個數據時,視圖方法中的表明主鍵的參數最好是pk
    def get(self,request,pk):
        """獲取一條數據"""
        return self.retrieve(request,pk)

    def put(self,request,pk):
        """更新一條數據"""
        return self.update(request,pk)

    def delete(self,request,pk):
        """刪除一條數據"""
        return self.destroy(request,pk)

二 、Generic的視圖子類

2.1 CreateAPIView

提供 post方法

繼承自: GenericAPIView、`CreateModelMixin

2.2 ListAPIView

提供 get 方法

繼承自:GenericAPIViewListModelMixin

2.3 RetrieveAPIView

提供 get方法

繼承自: GenericAPIViewRetrieveModelMixin

2.4 DestoryAPIView

提供 delete方法

繼承自:GenericAPIViewDestoryModelMixin

2.5 UpdateAPIView

提供 putpatch方法

繼承自:GenericAPIViewUpdateModelMixin

2.6 RetrieveUpdateAPIView

提供 getputpatch方法

繼承自: GenericAPIViewRetrieveModelMixinUpdateModelMixin

2.7 RetrieveUpdateDestoryAPIView

提供 getputpatchdelete方法

繼承自:GenericAPIViewRetrieveModelMixinUpdateModelMixinDestoryModelMixin

相關文章
相關標籤/搜索