针对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)
结果示意图: