2021-08-24

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值