两个视图基类 APIView、GenericAPIView (一层)
1、GenericAPIView 类分析
queryset = None
serializer_class = None
def get_queryset(self): # 查表的所有
def get_object(self): # 查单个
def get_serializer(self, *args, **kwargs): # 得到序列化类的对象,传instance,data,many.
filter_backends = 过滤类
pagination_class = 分页类
2、django本地化(国际化)配置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai' # 时区必须大写
USE_I18N = True
USE_L10N = True
USE_TZ = False
五个视图扩展类(二层) GenericAPIView + 5个扩展类
都是以modelmixin结尾,每个类里只写了一个自己的功能。
视图类需要继承view/APIView,这五个没继承,所以是视图扩展类。
class Book(GenericAPIView,UpdateModelMixin): # 继承GenericAPIView + 5个扩展类后调用该方法即可。
queryset = Book.objects.all()
serializer_class = Book_ModelSerializer
def put(self,request,pk):
return self.update(request,pk) # 调用update方法把参数传过去。
from rest_framework.mixins import
RetrieveModelMixin # 查询单条,类里有retrieve方法
ListModelMixin, # 查询所有,类里有list方法
CreateModelMixin, # 增加, 类里有create方法
DestroyModelMixin, # 删除, 类里有destroy方法
UpdateModelMixin, # 更新, 类里有update方法
九个视图子类(三层) DestroyAPIView
ListCreateAPIView子类里有查询所有的list方法,和增加的create方法。因为每个视图子类都继承了GenericAPIView和对应的扩展类。
继承之后只需要写两个类属性就ok了。
class BooksView(ListCreateAPIView):
queryset = Books.objects.all()
serializer_class = Book_MSerializer
from rest_framework.generics import
ListAPIView, # 查询所有
CreateAPIView, # 增加
RetrieveAPIView, # 查询单条
UpdateAPIView, # 更新
DestroyAPIView, # 删除
# 下面这4个是组合
ListCreateAPIView, # 查询所有、增加
RetrieveUpdateDestroyAPIView, # 查询单条、更新、删除
RetrieveDestroyAPIView, # 查询单条、删除
RetrieveUpdateAPIView # 查询单条、更新
视图集 (四层) 传字典对应关系。GenericViewSet
# GenericViewSet继承了ViewSetMixin, generics.GenericAPIView
# ViewSet继承了ViewSetMixin, views.APIView
总结:如果路由想写成特殊的,还想继承APIView,直接继承ViewSet.
总结:如果路由想写成特殊的,还想继承GenericAPIView,直接继承GenericViewSet.
路由层:
1、ModelViewSet把两个类的5个接口写成一个类。
class BookView(ModelViewSet):
queryset = Books.objects.all()
serializer_class = Book_MSerializer
2、ViewSetMixin 没继承。路由层要给它传字典,请求方式对应着视图类中的五个方法。
path('book/',views.BookView.as_view({'get':'list','post':'create'})),
path('book/<int:pk>',views.BookView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),
2.1、ViewSetMixin重写了as_view方法,里面的view方法使用反射完成了请求方式与视图类中的方法对应。
3、ReadOnlyModelViewSet 继承了GenericViewSet和两个扩展类。两个接口,查询所有,查询单条。
class BookView(ReadOnlyModelViewSet):
queryset = Books.objects.all()
serializer_class = Book_MSerializer
4、GenericViewSet 继承了ViewSetMixin,GenericAPIView
5、ViewSet 继承了ViewSetMixin,APIView
# 四个以viewset结尾,一个ViewSetMixin
from rest_framework.viewsets import
ModelViewSet, # 继承了五个扩展类和GenericViewSet
ReadOnlyModelViewSet, # 继承了两个扩展类和GenericViewSet
GenericViewSet, # 继承了ViewSetMixin和GenericAPIView
ViewSet, # 继承了ViewSetMixin和APIView
ViewSetMixin # 没有继承,它也没有任何方法。只完成请求方式与方法的对应关系。