一、Mixin混入类
Mixin混入类提供了几种后端视图(对数据资源进行增删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
这五个扩展类需要搭配GenericAPIView通用视图类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。
ListModelMixin:列表视图扩展类,提供list(request,*args,**kwargs)方法快速实现列表视图,返回200状态码,该Mixin的list方法会对数据进行过滤和分页。
from rest_framework.mixins import ListModelMixin # 获取多条数据,返回响应结果
class StudentMixinView(GenericAPIView, ListModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def get(self, request):
"""获取所有数据"""
return self.list(request)
CreateModelMixin:创建视图扩展类,提供creaete(request,*args,**kwargs)方法快速实现创建资源的视图,成功返回201状态码。
from rest_framework.mixins import CreateModelMixin # 添加一条数据
class StudentMixinView(GenericAPIView, CreateModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def post(self, request):
"""添加一条数据"""
return self.create(request)
RetrieveModelMixin: 详情视图扩展类,提供retreve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象,如果存在返回200,否则返回404。
from rest_framework.mixins import RetrieveModelMixin # 获取一条数据
class StudentInfoMixinView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def get(self, request, pk):
return self.retrieve(request, pk=pk)
UpdateModelMixin: 更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。
from rest_framework.mixins import UpdateModelMixin # 更新一条数据
class StudentInfoMixinView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def put(self, request, pk):
return self.update(request, pk=pk)
DestroyModelMixin:删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。
from rest_framework.mixins import DestroyModelMixin # 删除一条数据
class StudentInfoMixinView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def delete(self, request, pk):
return self.destroy(request, pk=pk)
二、9个视图子类
上面的接口代码还可以继续更加的精简,drf在使用GenericAPIView和Mixins进行组合以后,还提供了视图子类。
视图子类是通用视图类 和 模型扩展类 的子类,提供了各种的视图方法调用Mixins操作
ListAPIView = GenericAPIView + ListModelMixin获取多条数据的视图方法
CreateAPIView = GenericAPIView + CreateModelMixin添加一条数据的视图方法
RetrieveAPIView = GenericAPIView + RetrieveModelMixin获取一条数据的视图方法
UpdateAPIView = GenericAPIView + UpdateModelMixin更新一条数据的视图方法
DestroyAPIView = GenericAPIView + DestroyModelMixin删除一条数据的视图方法
组合视图子类
ListCreateAPIView = ListAPIView + CreateAPIView
RetrieveUpdateAPIView = RetrieveAPIView + UpdateAPIView
RetrieveDestrovAPIView = RetrieveAPIView + DestroyAPIView
RetrievmUpdateDestroyAPIView = RetrieveAPIView + UpdateAPIView + DestroyAPIView
views.py代码如下:
from rest_framework.generics import ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveDestroyAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
class StudentView(ListCreateAPIView):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
class StudentInfoView(RetrieveUpdateDestroyAPIView):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
这样一来,就发现视图子类比前面的APIView和Mixin扩展子类要更方便的多,希望本篇对你有所帮助