from rest_framework.generics import GenericAPIView
from rest_framework.request import Request
from rest_framework import filters
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from .models import Project
from . import serializers
from .filters import ProjectFilter
from utils.pagination import PageNumberPagination
# from utils import mixins
"""
# 源码中mixins.py文件中的Mixin拓展类
获取列表数据: ListModelMixin拓展类 -> list action方法 -> get
创建数据: CreateModelMixin拓展类 -> create action方法 -> post
获取详情数据: RetrieveModelMixin拓展类 -> retrieve action方法 -> get
更新数据: UpdateModelMixin拓展类 -> update action(完整更新)、partial_update action方法(部分更新) -> put、patch
删除数据: DestroyModelMixin拓展类 -> destroy action方法 -> delete
# 源码generics.py文件中的APIView具体的通用视图
获取列表数据: ListAPIView -> 继承ListModelMixin、GenericAPIView
创建数据: CreateAPIView -> 继承CreateModelMixin、GenericAPIView
获取详情数据: RetrieveAPIView -> 继承RetrieveModelMixin、GenericAPIView
更新数据: UpdateAPIView -> 继承UpdateModelMixin、GenericAPIView
删除数据: DestroyAPIView -> 继承DestroyModelMixin、GenericAPIView
# 源码viewsets.py文件中的ModelViewSet视图集, GenericViewSet继承了GenericAPIView,相当于把上面做了一个整合
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
# 源码generics.py文件中的APIView具体的混合通用视图
获取列表数据、创建数据:ListCreateAPIView
获取数据详情、更新数据:RetrieveUpdateAPIView
获取数据详情、删除数据:RetrieveDestroyAPIView
获取数据详情、更新数据、删除数据:RetrieveUpdateDestroyAPIView
# 视图集
1.如果需要实现在定义路由条目时,请求方法与要调用的action方法进行一一对应,必须得继承ViewSetMixin
2.ViewSet继承了ViewSetMixin、APIView,具备请求方法与要调用的action方法进行一一对应功能、以及认证授权限流功能,
但是不支持Mixin,因为没有提供get_object()、get_queryset()、geat_serializer()等方法
3.GenericViewSet继承了ViewSetMixin、GenericAPIView,具备请求方法与要调用的action方法进行一一对应功能、以及支持Mixin拓展类
4.ReadOnlyModelViewSet继承了RetrieveModelMixin、ListModelMixin、GenericViewSet,提供了读取数据的2个接口
5.ModelViewSet继承了CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、
ListModelMixin、GenericViewSet,提供了6个接口
6.ViewSetMixin类提供了请求方法与要调用的action方法进行一一对应功能,在定义路由条目时,在as_view()方法中支持接收字典数据,
把请求方法名称字符串作为key,把具体要调用的action方法名字符串作为值
"""
# class RetrieveAPIView(mixins.RetrieveModelMixin, GenericAPIView):
# # get是请求方法名称
# # retrieve是action名称
# def get(self, request, *args, **kwargs):
# return self.retrieve(request, args, kwargs)
#
#
# class UpdateAPIView(mixins.UpdateModelMixin, GenericAPIView):
# def put(self, request, *args, **kwargs):
# # update是一个action,完整更新
# return self.update(request, args, kwargs)
#
#
# class DestroyAPIView(mixins.DestroyModelMixin, GenericAPIView):
# def delete(self, request, *args, **kwargs):
# return self.destroy(request, args, kwargs)
# class ProjectDetailView(generics.RetrieveAPIView, generics.UpdateAPIView, generics.DestroyAPIView):
class ProjectDetailView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = serializers.ProjectModelSerializer2
queryset = Project.objects.all()
# 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.destroy(request, args, kwargs)
# class ProjectView(generics.ListAPIView, generics.CreateAPIView):
class ProjectView(generics.ListCreateAPIView):
serializer_class = serializers.ProjectModelSerializer2
queryset = Project.objects.all()
search_fields = ['name', 'leader', 'desc', 'interfaces__name']
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
filterset_class = ProjectFilter
pagination_class = PageNumberPagination
ordering_fields = ['name', 'id', 'leader']
# def get(self, request: Request, *args, **kwargs):
# return self.list(request, args, kwargs)
#
# def post(self, request: Request, *args, **kwargs):
# return self.create(request, args, kwargs)
# class ProjectAllView(generics.RetrieveUpdateDestroyAPIView, generics.ListCreateAPIView):
# serializer_class = serializers.ProjectModelSerializer2
# queryset = Project.objects.all()
# search_fields = ['name', 'leader', 'desc', 'interfaces__name']
# filter_backends = [filters.SearchFilter, filters.OrderingFilter]
# filterset_class = ProjectFilter
# pagination_class = PageNumberPagination
# ordering_fields = ['name', 'id', 'leader']
# 需求:将上面5个接口全部放在同一个类视图中
# class ViewSet(ViewSetMixin, views.APIView)
# class ProjectViewSet(viewsets.ViewSet):
# class ProjectViewSet(viewsets.ViewSetMixin, generics.GenericAPIView):
# class ProjectViewSet(viewsets.GenericViewSet):
# class ProjectViewSet(
# mixins.RetrieveModelMixin,
# mixins.UpdateModelMixin,
# mixins.DestroyModelMixin,
# mixins.ListModelMixin,
# mixins.CreateModelMixin,
# viewsets.GenericViewSet):
class ProjectViewSet(viewsets.ModelViewSet):
serializer_class = serializers.ProjectModelSerializer2
queryset = Project.objects.all()
search_fields = ['name', 'leader', 'desc', 'interfaces__name']
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
filterset_class = ProjectFilter
pagination_class = PageNumberPagination
ordering_fields = ['name', 'id', 'leader']
# def retrieve(self, request, *args, **kwargs):
# instance = self.get_object()
# serializer = self.get_serializer(instance=instance)
# return Response(serializer.data, status=status.HTTP_200_OK)
#
# def update(self, request, *args, **kwargs):
# serializer = self.get_serializer(data=request.data, instance=self.get_object())
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(serializer.data, status=status.HTTP_201_CREATED)
#
# def destory(self, request, *args, **kwargs):
# instance = self.get_object()
# instance.delete()
# return Response(None, status=status.HTTP_204_NO_CONTENT)
#
# 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(instance=page, many=True)
# return self.get_paginated_response(serializer.data)
#
# serializer = self.get_serializer(instance=queryset, many=True)
# return Response(data=serializer.data, status=status.HTTP_200_OK)
#
# def create(self, request, *args, **kwargs):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(data=serializer.data, status=status.HTTP_201_CREATED)
def name_detail(self, request, *args, **kwargs):
instance = self.get_object()
return Response({
'id': instance.id,
'name': instance.name
})
def names(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
data = [ obj.name for obj in queryset]
return Response(data)