mixin 类提供用于基本视图行为的操作。请注意,mixin 类提供操作方法,而不是直接定义处理程序方法。mixin 类可以从rest_framework.mixins导入,一般我们常用的就是下面几个。
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin
见名知意,它们实现了列表方法和增删改查。下面使用mixin配合GenericAPIView来重新实现在DRF二级视图GenericAPIView中所实现过的所有方法。
class BookCreateAndList(GenericAPIView, CreateModelMixin, ListModelMixin):
queryset = BookInfo.objects.all().order_by('id')
serializer_class = BookInfoSerializer
pagination_class = PageNum
def get(self, request):
"""列表方法"""
return self.list(request)
def post(self, request):
"""新增方法"""
return self.create(request)
class BookRUD(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
lookup_field = 'pk'
lookup_url_kwarg = 'pk'
def get(self, request, pk):
"""获取一条数据"""
return self.retrieve(request)
def put(self, request, pk):
"""新增一条数据"""
return self.update(request)
def delete(self, request, pk):
"""删除一条数据"""
return self.delete(request)
为了对比起见,GenericAPIView和Mixin配合使用的URL改为如下所示:
path('book1/', BookCreateAndList.as_view()),
path('book1/<int:pk>', BookRUD.as_view()),
两种实现方式的API响应页面截图如下所示:
GenericAPIView和Mixin配合使用,代码量减少了,但是得到的API效果是一致的。虽然这里我们展示的比较简单。但是实际开发中的80%业务常规业务,20%的业务是特殊情况。因此,GenericAPIView和Mixin配合使用还是非常方便的。