Django REST framework之分页、路由、视图、渲染器
目录结构:

DjWebApi3.urls:首路由
"""DjWebApi3 URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('API.urls')) ]
settings.py:配置文件设置
REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning', # /api/v1/users/ 版本配置 'DEFAULT_VERSION':'v1', # 默认版本 'ALLOWED_VERSIONS':['v1','v2'], # 可用版本 'VERSION_PARAM':'version', # 版本参数 'DEFAULT_PARSER_CLASSES':[ "rest_framework.parsers.JSONParser", "rest_framework.parsers.FormParser", "rest_framework.parsers.MultiPartParser", ], 'PAGE_SIZE':10, # 每页的数量 'UNICODE_JSON': False, # 编码格式 }
urls.py:路由
from django.urls import path,re_path,include from API.views import ViewsPaper,ViewsRenders,ViewsCaches,ViewsVS from rest_framework import routers # 全自动路由 router = routers.DefaultRouter() router.register('vs3', ViewsVS.Vs3) # urlpatterns = [ # path('demo/',ViewsCaches.index,name='demo'), # re_path(r'^(?P<version>[v1|v2]+)/paper/$', ViewsPaper.PaperView.as_view()), # re_path(r'^(?P<version>[v1|v2]+)/vs1/$', ViewsVS.Vs1.as_view()), # re_path(r'^(?P<version>[v1|v2]+)/vs2/$', ViewsVS.Vs2.as_view({'get': 'list'})), # re_path(r'^(?P<version>[v1|v2]+)/vs3/$', ViewsVS.Vs3.as_view({'get': 'list','post':'create'})), # re_path(r'^(?P<version>[v1|v2]+)/vs3/(?P<pk>\d+)$', ViewsVS.Vs3.as_view( # { # 'get': 'retrieve', # 查看单条数据 (?P<pk>\d+) # 'delete':'destroy', # 删除单条数据 (?P<pk>\d+) # 'put':'update', # 全部更新 (?P<pk>\d+) # 'patch':'partial_update', # 局部更新 (?P<pk>\d+) # } # )), # # ] urlpatterns = [ re_path(r'^(?P<version>[v1|v2]+)/render/$', ViewsRenders.RenderView.as_view()), re_path(r'^(?P<version>[v1|v2]+)/', include(router.urls)), # url前缀 ] # 自动生成路由 """ api/ ^(?P<version>[v1|v2]+)/ ^vs3/$ [name='userinfo-list'] api/ ^(?P<version>[v1|v2]+)/ ^vs3\.(?P<format>[a-z0-9]+)/?$ [name='userinfo-list'] api/ ^(?P<version>[v1|v2]+)/ ^vs3/(?P<pk>[^/.]+)/$ [name='userinfo-detail'] api/ ^(?P<version>[v1|v2]+)/ ^vs3/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='userinfo-detail'] api/ ^(?P<version>[v1|v2]+)/ ^$ [name='api-root'] api/ ^(?P<version>[v1|v2]+)/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root'] """
ViewsPaper:分页
from rest_framework.views import APIView from rest_framework.response import Response from API.utils.serializsers.pager import PagerSerializers from API import models from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination # 1、分页,看第N页,每页显示N条数据 """ class MyPageNumberPagination(PageNumberPagination): # 每页显示多少数量 page_size = 10 # 定义参数 page_size_query_param = 'size' # 定义最大显示数量 max_page_size = None # 页码参数 page_query_param = 'page' """ # 2、分页,在N个位置,向后查看N条数据 """ class MyPageNumberPagination(LimitOffsetPagination): # 每页显示多少数量 default_limit = 10 # 定义参数 limit_query_param = 'limit' # 定义最大显示数量 max_limit = None # 页码参数 offset_query_param = 'offset' """ # 3、加密方式 class MyPageNumberPagination(CursorPagination): # 每页条数 page_size = 30 # 页码参数 cursor_query_param = 'cursor' # 数据库字段排序 ordering = 'id' # 可定制页码参数 page_size_query_param = None # 最大显示数量 max_page_size = None class PaperView(APIView): def get(self, request, *args, **kwargs): # 获取所有数据 u_ob = models.UserInfo.objects.all() # 创建分页对象 # pg = PageNumberPagination() # 组件类 ?page=10 # pg = LimitOffsetPagination() # 组件类 ?offset=1&limit=30 # pg = CursorPagination() # 组件类 默认根据字段created排序 pg = MyPageNumberPagination() # 在数据库获取分页数据 pg_u = pg.paginate_queryset(queryset=u_ob, request=request, view=self) # 序列化数据 res = PagerSerializers(instance=pg_u, many=True) return pg.get_paginated_response(res.data) # return Response(res.data)
ViewsVS:视图
from rest_framework.response import Response from API import models from API.views.ViewsPaper import MyPageNumberPagination from API.utils.serializsers.pager import PagerSerializers # 视图一:GenericAPIView 基本无用 from rest_framework.generics import GenericAPIView class Vs1(GenericAPIView): queryset = models.UserInfo.objects.all() serializer_class = PagerSerializers pagination_class = MyPageNumberPagination def get(self,request,*args,**kwargs): # 获取数据 userinfo = self.get_queryset() # 分页 page_data = self.paginate_queryset(userinfo) # 序列化 result = self.get_serializer(instance=page_data, many=True) return Response(result.data) # 视图二:GenericAPIView 也没啥用 from rest_framework.viewsets import GenericViewSet class Vs2(GenericViewSet): queryset = models.UserInfo.objects.all() serializer_class = PagerSerializers pagination_class = MyPageNumberPagination def list(self, request, *args, **kwargs): # 获取数据 userinfo = self.get_queryset() # 分页 page_data = self.paginate_queryset(userinfo) # 序列化 result = self.get_serializer(instance=page_data, many=True) return Response(result.data) # 视图二:ModelViewSet from rest_framework.viewsets import ModelViewSet class Vs3(ModelViewSet): queryset = models.UserInfo.objects.all() serializer_class = PagerSerializers pagination_class = MyPageNumberPagination
ViewsRenders:渲染器
from API.utils.serializsers.pager import PagerSerializers from API.views.ViewsPaper import MyPageNumberPagination from API import models from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer from rest_framework.views import APIView class RenderView(APIView): """ JSONRenderer: /api/v1/render/?format=json 以json格式渲染 BrowsableAPIRenderer: /api/v1/render/ 以浏览器格式渲染 """ renderer_classes = [JSONRenderer, BrowsableAPIRenderer] def get(self,request,*args,**kwargs): u_ob = models.UserInfo.objects.all() pg = MyPageNumberPagination() # 在数据库获取分页数据 pg_u = pg.paginate_queryset(queryset=u_ob, request=request, view=self) # 序列化数据 res = PagerSerializers(instance=pg_u, many=True) return pg.get_paginated_response(res.data)

浙公网安备 33010602011771号