from rest_framework.pagination import PageNumberPagination as _PageNumberPagination
class PageNumberPagination(_PageNumberPagination):
page_size = 4
page_query_param = 'page'
page_query_description = '指定获取的页码'
page_size_query_param = 'page_size'
page_size_query_description = '指定每一页的数据条数'
max_page_size = 100
def get_paginated_response(self, data):
response = super().get_paginated_response(data)
response.data['current_page'] = self.page.number
response.data['total_page_count'] = self.page.paginator.num_pages
return response
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework import filters
from rest_framework import status
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from .models import Projects
from . import serializers
"""
XxxMixin拓展类
获取列表数据: ListModelMixin拓展类 -> list action方法
创建数据: CreateModelMixin拓展类 -> create action方法
获取详情数据: RetrieveModelMixin拓展类 -> retrieve action方法
更新数据: UpdateModelMixin拓展类 -> update action(完整更新)、partial_update action方法(部分更新)
删除数据: DestroyModelMixin拓展类 -> destroy action方法
XxxXxxAPIView具体的通用视图
获取列表数据: ListAPIView -> 继承ListModelMixin、GenericAPIView
创建数据: CreateAPIView -> 继承CreateModelMixin、GenericAPIView
获取详情数据: RetrieveAPIView -> 继承RetrieveModelMixin、GenericAPIView
更新数据: UpdateAPIView -> 继承UpdateModelMixin、GenericAPIView
删除数据: DestroyAPIView -> 继承DestroyModelMixin、GenericAPIView
获取列表数据、创建数据: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 ListModelMixin:
# """
# 获取列表数据:ListModelMixin拓展类 -> list action方法
# """
# def list(self, request):
# queryset = self.get_queryset()
# queryset = self.filter_queryset(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(serializer.data)
#
#
# class CreateModelMixin:
# """
# CreateModelMixin拓展类 -> create action方法
# """
# def create(self, request):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(serializer.data, status=status.HTTP_201_CREATED)
#
#
# class RetrieveModelMixin:
# def retrieve(self, request, *args, **kwargs):
# obj = self.get_object()
# serializer = self.get_serializer(instance=obj)
# return Response(serializer.data)
#
#
# class UpdateModelMixin:
# def update(self, request, *args, **kwargs):
# obj = self.get_object()
# serializer = self.get_serializer(instance=obj, data=request.data)
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(serializer.data, status=201)
#
#
# class DestroyModelMixin:
# def destroy(self, request, *args, **kwargs):
# obj = self.get_object()
# obj.delete()
# return Response(None, status=204)
# class ProjectView(GenericAPIView):
# class ListCreateAPIView(mixins.ListModelMixin,
# mixins.CreateModelMixin,
# GenericAPIView):
# def get(self, request, *args, **kwargs):
# return self.list(request, *args, **kwargs)
#
# def post(self, request, *args, **kwargs):
# return self.create(request, *args, **kwargs)
# 假如:只需要提供创建用例数据的接口
# class CreateTestcases(generics.CreateAPIView):
# class CreateTestcases(mixins.CreateModelMixin, GenericAPIView):
# queryset =
# serializer_class =
#
# def get(self, request, *args, **kwargs):
# return self.create(request, *args, **kwargs)
# class ProjectView(mixins.ListModelMixin,
# mixins.CreateModelMixin,
# GenericAPIView):
class ProjectView(generics.ListCreateAPIView):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
search_fields = ['=name', '^leader']
# def get(self, request):
# # queryset = self.get_queryset()
# # queryset = self.filter_queryset(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(serializer.data)
# return self.list(request)
#
# def post(self, request):
# # serializer = self.get_serializer(data=request.data)
# # serializer.is_valid(raise_exception=True)
# # serializer.save()
# # return Response(serializer.data, status=201)
# return self.create(request)
# class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
# mixins.UpdateModelMixin,
# mixins.DestroyModelMixin,
# GenericAPIView):
# 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)
#
# def patch(self, request, *args, **kwargs):
# return self.partial_update(request, *args, **kwargs)
# class ProjectDetailView(mixins.RetrieveModelMixin,
# mixins.UpdateModelMixin,
# mixins.DestroyModelMixin,
# GenericAPIView):
class ProjectDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer
# def get(self, request, *args, **kwargs):
# # obj = self.get_object()
# # serializer = self.get_serializer(instance=obj)
# # return Response(serializer.data)
# return self.retrieve(request, *args, **kwargs)
#
# def put(self, request, *args, **kwargs):
# # obj = self.get_object()
# # serializer = self.get_serializer(instance=obj, data=request.data)
# # serializer.is_valid(raise_exception=True)
# # serializer.save()
# # return Response(serializer.data, status=201)
# return self.update(request, *args, **kwargs)
#
# def delete(self, request, *args, **kwargs):
# # obj = self.get_object()
# # obj.delete()
# # return Response(None, status=204)
# return self.destroy(request, *args, **kwargs)
#
# def patch(self, request, *args, **kwargs):
# return self.partial_update(request, *args, **kwargs)
# class ProjectViewSet(generics.GenericAPIView):
# class ProjectViewSet(viewsets.ViewSet):
# class ProjectViewSet(viewsets.ViewSetMixin, APIView,
# class ProjectViewSet(viewsets.ViewSetMixin, generics.GenericAPIView,
# class ProjectViewSet(viewsets.GenericViewSet,
# mixins.ListModelMixin,
# mixins.RetrieveModelMixin,
# mixins.CreateModelMixin,
# mixins.UpdateModelMixin,
# mixins.DestroyModelMixin,):
class ProjectViewSet(viewsets.ModelViewSet):
# def list(self, request, *args, **kwargs):
# pass
#
# def retrieve(self, request, *args, **kwargs):
# pass
#
# def create(self, request, *args, **kwargs):
# pass
#
# def update(self, request, *args, **kwargs):
# pass
#
# def partial_update(self, request, *args, **kwargs):
# pass
#
# def destroy(self, request, *args, **kwargs):
# pass
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer
# filter_backends = [filters.SearchFilter, filters.OrderingFilter]
# search_fields = ['=name', '^leader']
@action(methods=['get'], detail=False)
def names(self, request, *args, **kwargs):
queryset = self.get_queryset()
name_list = [{'name': obj.name} for obj in queryset]
return Response(name_list)
# class RetrieveDestroyProject(mixins.RetrieveModelMixin,
# mixins.DestroyModelMixin, generics.GenericAPIView):
# class RetrieveDestroyProject(generics.RetrieveDestroyAPIView):
# queryset = Projects.objects.all()
# serializer_class = serializers.ProjectModelSerializer
#
# def get(self, request, *args, **kwargs):
# return self.retrieve(request, *args, **kwargs)
#
# def delete(self, request, *args, **kwargs):
# return self.destroy(request, *args, **kwargs)
class RetrieveDestroyProject(mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerializer