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)

 

posted @ 2019-04-23 08:59  我在地球凑人数的日子  阅读(167)  评论(0)    收藏  举报