1.APIView
1.APIView是REST framework提供的所有视图的基类,继承自Django的View;
2.支持定义的属性:
authentication_classes 列表或元祖,身份认证类
permissoin_classes 列表或元祖,权限检查类
throttle_classes 列表或元祖,流量控制类3.在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。
class BookListView(APIView):
def get(self, request):
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
return Response(serializer.data)
2.GenericAPIView
1.继承自APIVIew,主要增加了操作序列化器和数据库查询的方法
2.提供的关于序列化器使用的属性与方法:
①属性:
serializer_class 指明视图使用的序列化器
②方法:
get_serializer_class(self) 返回序列化器类,默认返回serializer_class
get_serializer(self, args, *kwargs) 返回序列化器对象3.提供的关于数据库查询的属性与方法:
①属性:
queryset 指明使用的数据查询集
②方法:
get_queryset(self) 返回视图使用的查询集
get_object(self) 返回详情视图所需的模型类数据对象
class BookDetailView(GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request, pk):
# get_object()方法根据pk参数查找queryset中的数据对象
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data)
3.五个扩展类ListModelMixin/CreateModelMixin/RetrieveModelMixin/UpdateModelMixin/DestroyModelMixin
这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法
在此仅介绍ListModelMixin的用法,其他几个类比
class BookListView(ListModelMixin, GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self, request):
# list的方法封装了查询集,序列化,返回序列化的过程,可以直接调用即可
return self.list(request)
# ListModelMixin源码参考
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
# 过滤
queryset = self.filter_queryset(self.get_queryset())
# 分页
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 序列化
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
4.五个扩展类的子类 CreateAPIView/ListAPIView/RetrieveAPIView/DestoryAPIView/UpdateAPIView
日常用的较多,五个子类继承了各自的扩展类和GenericAPIView,并进一步封装了get/post/put/delete方法,所以继承扩展类的子类时不用再定义get/post/put/delete方法
class BookView(ListAPIView,CreateAPIView):
serializer_class = BookSerialziers # 指定序列化器
queryset = BookInfo.objects.all() # 所有查询集
# ListAPIView源码参考
class ListAPIView(mixins.ListModelMixin,GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# CreateAPIView源码参考
class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):
"""
Concrete view for creating a model instance.
"""
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)