11.mixins混合类
一、混合类(mixins)
使用基于类的视图,最大的优势之一就创建可复用的代码
我们编写的非常类似的代码,可以抽象出来,将这部分代码放到mixin类系列中,然后作为父类提供子类继承使用
from rest_framework import mixins # 导入
二、使用mixins
from rest_framework import mixins # 导入mixins类 from rest_framework import generics # 导入generics类 # 定义类视图 继承需要使用的mixnis类的方法 # 继承generics.GenericAPIView 视图方法 class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() # 指定要查询的集合 serializer_class = SnippetSerizlizer # 指定要使用的序列化器 #queryset 和 serializer_class 是继承的generics.GenericAPIView的类属性 # 定义get方法 def get(self, request, *args, **kwargs): # 使用ListModelMixin 的list方法 将数据自动转换格式处理返回 return self.list(request, *args, **kwargs) # 定义post方法 def post(self, request, *args, **kwargs): # 使用CreateModelMixin的create方法 return self.create(request, *args, **kwargs) class SnippetListDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView): queryset = Snippet.objects.all() # 指定要查询的集合 serializer_class = SnippetSerizlizer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self,request,*args,**kwargs): return self.update(request, *args, **kwargs) def delete(self,request, *args, **kwargs): return self.delete(request, *args, **kwargs)
三、使用通用的基于类的视图
通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步,rest框架提供了一组已经混合好的(mixed-in)通用视图
类,我们可以使用它来简化我们的views.py
只需要继承generics模块中的现成的某个通用类视图,比如ListCreateAPIView,然后在类里定义queryset和serializer_class两个属性的值
# 继承generics.ListCreateAPIView class SnippetList(generics.ListCreateAPIView): # 定义queryset和serializer_class两个属性的值 queryset = Snippet.objects.all() serializer_class = SnippetSerizlizer # 继承generics.RetrieveUpdateDestroyAPIView class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerizlizer ''' generics.ListCreateAPIView 源码继承了mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView,封装了get和post方法 generics.RetrieveUpdateDestroyAPIView 源码继承了mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,GenericAPIView,封装了 get、put、delete、patch方法 所以我们只需要继承对应的类,然后定义queryset和serializer_class两个属性的值,剩下交给drf完成 '''
风月都好看,人间也浪漫.