Django-10-Mixin、xxxAPIView、GenericViewSet

1、ModelMixin 

Mixin方法能够简化get、post、put、delete等请求

from rest_framework import mixins

mixins.ListModelMixin:get整个项目数据列表

mixins.CreateModelMixin:创建

mixins.RetrieveModelMixin:get项目中某一详情数据

mixins.UpdateModelMixin:更新、修改

mixins.DestroyModelMixin:删除

from .models import Interfaces
from rest_framework.generics import GenericAPIView
from rest_framework.request import Request
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework import mixins
from . import serializers
from utils.pagination import PageNumberPagination


class InterfacesView(mixins.ListModelMixin,
                     mixins.CreateModelMixin,
                     GenericAPIView):
    queryset = Interfaces.objects.all()
    serializer_class = serializers.InterfacesModelSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['^name', '=tester']
    ordering_fields = ['id', 'name', 'tester']
    pagination_class = PageNumberPagination

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

    def post(self, request: Request):
        return self.create(request)


class InterfacesDetailView(mixins.RetrieveModelMixin,
                           mixins.UpdateModelMixin,
                           mixins.DestroyModelMixin,
                           GenericAPIView):
    queryset = Interfaces.objects.all()
    serializer_class = serializers.InterfacesModelSerializer

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

    def put(self, request: Request, pk):
        return self.update(request)

    def delete(self, request: Request, pk):
        return self.destroy(request)

 

2、xxxAPIView

xxxAPIView = ModelMixin + GenericAPIView


  •  class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,GenericAPIView)

 

 

from rest_framework import viewsets

3、ViewSet

 ViewSet =  ViewSetMixin + APIView

 ViewSet支持请求方法与action方法进行一一映射,action方法可以支持改名

urls.py

urlpatterns = [
    # a.只要继承了ViewSet的类视图,那么就支持请求方法名称与action名称进行一一对应的功能,是ViewSetMixin提供对的
    # b.在as_view方法中添加字典,key为请求方法名称(get、post、put、delete、patch、option、head)
    # value为需要调用的action方法名称
    path('projects/', views.ProjectViewSet.as_view({
        'get': 'list',
        'post': 'create'
    })),
    path('projects/<int:pk>/', views.ProjectViewSet.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })),

 

4、GenericViewSet

a.ViewSet继承了ViewSetMixin、views.APIView,所以未提供对于分页、过滤功能的支持
b.GenericViewSet继承了ViewSetMixin、generics.GenericAPIView,所以支持分页、过滤功能

GenericViewSet = ViewSetMixin + GenericAPIView

在定义路由时,需要在路由中绑定action方法

5、GenericViewSet + ModelMixin = ModelViewSet

GenericViewSet + ModelMixin 提供action方法映射、分页过滤、合并get等代码的所有功能

 如果不想继承ModelMixin 中那么多的方法,可以选择性的用ReadOnlyModelViewSet、ModelViewSet

原文地址:https://www.cnblogs.com/erchun/p/14482720.html