import json
from django.http import HttpResponse, JsonResponse
# 子应用视图
from django.views import View
from rest_framework import status, filters
from rest_framework.filters import OrderingFilter
from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.renderers import JSONRenderer
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import mixins
from projects.models import Projects
# from projects.serializers import ProjectSerializer
from projects.serializers import PorjectModelSerializer
from utils.pagination import PageNumberPagination
# class ProjectsView(View):
# class ProjectsView(APIView):
# class ProjectsView(GenericAPIView):
# class ProjectsView(mixins.ListModelMixin,
# mixins.CreateModelMixin,
# GenericAPIView):
class ProjectsView(ListCreateAPIView):
queryset = Projects.objects.all()
serializer_class = PorjectModelSerializer
# 2。 类视图中指定可用于过滤查询的字段search_fields = [xxx]
search_fields = ['^full_name', 'id']
# 配置过滤器类
filter_backends = [filters.SearchFilter, OrderingFilter]
# 排序字段
ordering_fields = ['full_name', 'leader', 'id']
# 指定自定义的分页器引擎(先导入)
pagination_class = PageNumberPagination
class ProjectDetailView(RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = PorjectModelSerializer
# 自定义lookup_field 值
lookup_url_kwarg = 'pk'
分析上面类视图,发现两个类视图都没有特别自定义的实例方法,那么能做到将两个类视图合成1个类视图吗?
分析: ProjectsView类视图提供get()方法调用list()方法,post()方法调用create()方法; ProjectDetailView类视图提供get()方法调用retrieve()方法, put()方法调用update()方法,delete()方法调用destroy()方法;
如果一个类中同时提供了list(),create(),retrieve(),update(),destroy()五个方法,岂不就可以兼容这两个类视图了吗?
1.自定义一个viewSet类视图,包含5种方法:
2. 只要类视图继承自定义包含5种方法的父类,就可以兼容两个类视图的处理逻辑(路由表urls.py中还要特殊处理下)
3.路由表urls.py中处理路由
只有继承了viewsets.ViewSet类,才能在路由中使用这种匹配模式
当上图路由开始生效时,当获取到put方法时,就会去调用ProjectViewSet类中的update()方法.
4. 合并的新类视图继承viewsets.ViewSet:
继承了视图集父类ViewSet:
1.在定义url条目时,支持给as_view()传递字典参数。
2.ViewSet继承了ViewSetMixin, views.APIView.
3.继承了ViewSetMixin,所以可以给as_view()传递字典参数
4.继承了views.APIView,所以具备APIView的所有授权,限流等功能。
只有继承了viewsets.ViewSet类,才能在路由中使用这种匹配模式
5. 继承Mixin拓展类提供的list(),create(),retrieve(),update(),destroy()方法
新的合并类视图中需要list,create,retrieve,update,destroy五种方法,而Mixin拓展类中已经提供了这5中方法,直接继承就可以不用自己定义了
6.前端调用验证
报错AttributeError: 'ProjectViewSet' object has no attribute 'filter_queryset'
而filter_queryset为搜索过滤方法,在GenericAPIView中具备该功能,所以我们还得继承GenericAPIView
ViewSet和GenericViewSet都继承了ViewSetMixin,所以都具备url路由根据关键字匹配的能力
输出
7. 以上新视图类中继承的6个父类,与viewsets.py模块中的ModelViewSet类完全一致,所以新视图类可以继承viewsets.ModelViewSet类
7.1 继承ModelViewSet类
经测试,功能正常
8.类视图继承视图集时选择何种视图集?
1.ModelViewSet是最完整的视图集类,提供了:
列表数据接口,创建数据接口,获取详情数据接口,更新数据接口,删除数据接口
2.如果需要对某个模型类进行增删改查操作,才使用ModelViewSet视图集类
3.如果仅仅是对某个模型进行数据读取操作只需要获取列表数据接口,获取详情数据接口),一般选择ReadOnlyViewSet视图集类,这样能保证数据安全.
暑期编程PK赛 得CSDN机械键盘等精美礼品!



