django restframework APIView和GenericAPIView的总结(九)

在这里插入图片描述
针对django rest framework中的APIView和GenericAPIView

1.APIView:继承了Django的View
a. Request对象实现了继承并对Django HttpRequest对象的进一步封装
b. Response对象实现了继承并对Django HttpResponse对象的进一步封装
c. 实现了权限校验,认证及频率三大校验

2.GenericAPIView: 继承了APIView
额外实现了: 分页,排序(ordering=name升序,ordering=-name降序,ordering=-name,age先按照name降序,然后按照age升序),过滤(查询字符串进行过滤)

3.如下示例,GenericAPIView的使用代码

MyPagination是自定义的页面分页类:继承并重写了PageNumberPagination,只有重写了此类并设置了类属性page_size_query_param ,才能在前端自定义页面显示数量

a.自定义的pagination

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    page_size = 5
    max_page_size = 50
    page_size_query_param = "s"
    page_query_param = "p"

b. settings.py中

REST_FRAMEWORK={
    
    
    'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer',
                                'rest_framework.renderers.BrowsableAPIRenderer',],
     'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser',
                               'rest_framework.parsers.FormParser',
                               'rest_framework.parsers.MultiPartParser'],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',
                                'rest_framework.filters.OrderingFilter'
                                ],
    # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'DEFAULT_PAGINATION_CLASS': 'utils.pagination.MyPagination',
    'PAGE_SIZE': 2
}


from django.views import View
from .models import Projects
from .serializers import ProjectSerializses
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView

class ProjectsView(GenericAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectSerializses
    # 指定过滤字段
    filterset_fields = ['name', 'leader']
    # 排序
    ordering_fields = ['name', 'id']
    # ordering = ['username'] 默认排序
    # pagination_class=None

    def get(self,request):
        """
        输出所有的项目信息
        :param request:
        :return:
        """
        qs = self.get_queryset()
        qs = self.filter_queryset(queryset=qs)
        page_qs = self.paginate_queryset(queryset=qs)
        if page_qs is None:
            ser = self.get_serializer(instance=page_qs, many=True)
            return self.get_paginated_response(ser.data)
        ser = self.get_serializer(instance=qs,many=True)
        result = {
    
    "code": "0", "message": "success", "data": ser.data}
        return Response(result)

    def post(self, request):
        # 1.获取请求参数
        resquest_data = request.data
        ser = ProjectSerializses(data=resquest_data)
        ser.is_valid(raise_exception=True)
        ser.save()
        result = {
    
    "code": "0", "message": "success", "data": ser.data}

        return Response(result)

    def delete(self, request, pk):
        pass

class ProjectDetailView(GenericAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectSerializses

    def get(self, request, pk):
        ser = self.get_serializer(instance=self.get_object())
        result = {
    
    "code": "0", "message": "success", "data": ser.data}
        return Response(result)

结果示意图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43534980/article/details/111412555
今日推荐