Django Rest Framework之视图
一:DRF视图
DRF一共有四个视图文件,分别为:
- views.py:视图(APIView)
- generics.py:工具视图
- mixins:视图工具集
- viewsets:视图集
二:generics.GenericAPIView
GenericAPIView在APIView的基础上完成了以下功能:
- get_queryset()
从类属性queryset中获取model的queryset数据 - get_object()
从类属性queryset中获取model的queryset数据,再通过有名分组PK查询唯一操作对象;如果URL中有名分组不是PK,那到可以使用下面的lookup_field指定 - get_serializer()
从类属性serializer_class中获得serializer序列化类
class BookGenericAPIView(GenericAPIView):
queryset = Book.objects.filter(is_delete=False)
serializer_class = BookModelSerializer
lookup_field = 'pk'
# 群取
# def get(self, request):
# book_query = self.get_queryset()
# book_ser = self.get_serializer(book_query, many = True)
# return Response(book_ser.data)
# 单取
def get(self, request, *args, **kwargs):
book_query = self.get_object()
book_ser = self.get_serializer(book_query)
return Response(book_ser.data)
三:mixins中的视图工具类
mixins.py视图文件中提供了五个视图方法,如下:
该五个视图方法配合generics.GenericAPIView方法使用
注意:DestroyModelMixin方法中的删除操作是物理删除,非逻辑删除。生产环境中可将该方法重写做逻辑删除。
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
class BookMixinGenericView(ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericAPIView):
queryset = Book.objects.filter(is_delete=False)
serializer_class = BookModelSerializer
def get(self, request, *args, **kwargs):
if 'pk' in kwargs:
response = self.retrieve(request, *args, **kwargs)
else:
response = self.list(request, *args, **kwargs)
# response的数据存放在response.data中
return APIResponse(results=response.data)
def post(self, request, *args, **kwargs):
response = self.create(request, *args, **kwargs)
return APIResponse(results=response.data)
def put(self, request, *args, **kwargs):
# 整体修改:即所有字段都要走数据校验。参数partial = False
response = self.update(request, *args, **kwargs)
return APIResponse(results=response.data)
def patch(self, request, *args, **kwargs):
# 局部修改:即前端传递几个字段过来就检验几个字段,没传递过来的就不校验。参数partial = True
response = self.partial_update(request, *args, **kwargs)
return APIResponse(results=response.data)
四:generics中的视图工具类
generics中的视图工具类是对generics.GenericAPIView,与mixins中的五个视图工具类的进一步封装
不同的视图类中重写了不同的请求方法
# ListCreateAPIView方法中提供群查,单增功能
class BookListCreateView(generics.ListCreateAPIView):
queryset = Book.objects.filter(is_delete=False)
serializer_class = BookModelSerializer
五:viewsets
viewsets视图集都是优先继承ViewSetMixin类,再继承一个视图类
ViewSetMixin提供了重写的as_view()方法,继承视图集的视图类,配置路由时调用as_view()必须传入 {请示名:函数名} 映射的关系字典
class BookGenericViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = Book.objects.filter(is_delete=False)
serializer_class = BookModelSerializer
# 下面可以重写很多方法
# def get_list(self, request, *args, **kwargs):
# return self.list(request, *args, **kwargs)
#
# def get_retrieve(self, request, *args, **kwargs):
# return self.retrieve(request, *args, **kwargs)
路由配置:
re_path(r'^v5/books/$', views.BookGenericViewSet.as_view({'get': 'list'})),
re_path(r'^v5/books/(?P<pk>.*)/$', views.BookGenericViewSet.as_view({'get': 'retrieve'})),
GenericViewSet与ViewSet都继承了ViewSetMixin,as_view都可以配置 请求-函数名 映射
GenericViewSet继承的是GenericAPIView视图类,用来完成标准的model类操作接口
ViewSet继承的是APIView视图类,用来完成不需要model类参与或是非标准的model类操作接口
如:
post请求在标准的model类操作下就是新增接口,登陆的post不满足
post请求验证码的接口,不需要model类的参与
class BookModelViewSet(viewsets.ModelViewSet):
queryset = Book.objects.filter(is_delete=False)
serializer_class = BookModelSerializer
# 重写destroy方法,改为逻辑删除
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
if not instance:
return Response('failed')
instance.is_delete = True
instance.save()
return Response('success')
路由配置:
re_path(r'^v6/books/$', views.BookModelViewSet.as_view({'get': 'list', 'post': 'create'})),
re_path(r'^v6/books/(?P<pk>.*)/$', views.BookModelViewSet.as_view({'get': 'retrieve', 'put':'update', 'patch': 'partial_update', 'delete': 'destroy'})),