zoukankan      html  css  js  c++  java
  • Django REST framework 之分页,视图,路由,渲染器

    1.分页

    2.视图

    3.路由

    4.渲染器

    1.分页

    方法一:

    from django.shortcuts import render
    from rest_framework.versioning import URLPathVersioning
    from rest_framework.views import  APIView
    from rest_framework.response import Response
    from .serializer import IndexSerializer
    from  rest_framework.pagination import  LimitOffsetPagination,PageNumberPagination,CursorPagination
    from . import models
    
    # Create your views here.
    #方法一,有分页,基于limint offset 分页
    class P1(LimitOffsetPagination):
        default_limit =1#一页默认几个
        limit_query_param = 'limit' #关键字后面跟的是一页显示几个
        offset_query_param = 'offset'#这个后面跟的是从哪里显示
        max_limit = 2 #这个是一页最多显示有几个
    #如果把数据放在对象里面,就要变成字典形式即可
    class BaseResponse(object):
        def __init__(self,code=1000,data=None,error=None):
            self.code=code
            self.data=data
            self.error=error
    
    
    class IndexView(APIView):
        def get(self,request,*args,**kwargs):
            ret=BaseResponse()
            try:
                user_list=models.UserInfo.objects.all()#找到所有的数据项
                p1 = P1()#实例化分页器,
                page_user_list=p1.paginate_queryset(queryset=user_list,request=request,view=self)#把数据放在分页器上面
                ser=IndexSerializer(instance=page_user_list,many=True)#序列化数据
                ret.data=ser.data
                ret.next=p1.get_next_link()
            except Exception as e:
                ret.code=1001
                ret.error='xxxx错误'
    
    
    
            return Response(ret.__dict__)      #对象序列化不了,转成字典形式即可
                # return  p1.get_paginated_response(ret)#这个会显示上一页和下一页
            # return  p1.get_paginated_response(ser.data)#这个会显示上
    #1.2 普通方法
    class IndexView(APIView):
        def get(self,request,*args,**kwargs):
            user_list=models.UserInfo.objects.all()#找到所有的数据项
            p1 = P1()#实例化分页器,
            page_user_list=p1.paginate_queryset(queryset=user_list,request=request,view=self)#把数据放在分页器上面
            ser=IndexSerializer(instance=page_user_list,many=True)#序列化数据
            ret={
                'code':111,
                'data':ser.data
            }
            # return Response(ret)#这个不会显示上一页和下一页
            # return  p1.get_paginated_response(ret)#这个会显示上一页和下一页
            return  p1.get_paginated_response(ser.data)#这个会显示上一页和下一页

    方法二:

    方法二:#http://127.0.0.1:8000/app01/v1/user/?page=1&size=2
    # class P2(PageNumberPagination):
    #     #每页显示的数据条数
    #     page_size =2 #每页显示的多少
    #     page_size_query_param = 'size'#关键字
    #     max_page_size = 5 #每页最多显示多少个
    #     #页码
    #     page_query_param = 'page'#页码是从1开始的,也是关键字
    #
    #
    # class IndexView(APIView):
    #     def get(self,request,*args,**kwargs):
    #         user_list=models.UserInfo.objects.all()#找到所有的数据项
    #         p1 = P2()#实例化分页器,
    #         page_user_list=p1.paginate_queryset(queryset=user_list,request=request,view=self)#把数据放在分页器上面
    #         ser=IndexSerializer(instance=page_user_list,many=True)#序列化数据
    #         ret={
    #             'code':111,
    #             'data':ser.data
    #         }
    #         # return Response(ret)#这个不会显示上一页和下一页
    #         # return  p1.get_paginated_response(ret)#这个会显示上一页和下一页
    #         return  p1.get_paginated_response(ser.data)#这个会显示上一页和下一页

    方法三:

    class P3(CursorPagination):
    #     cursor_query_param = 'cursor'#关键字,c
    #     page_size =2 #每页默认的数量
    #     ordering = 'id'#按照id排列
    #     page_size_query_param ='page_size'#每页显示的数量
    #
    #
    #
    # class IndexView(APIView):
    #     def get(self,request,*args,**kwargs):
    #         user_list=models.UserInfo.objects.all()#找到所有的数据项
    #         p1 = P3()#实例化分页器,
    #         page_user_list=p1.paginate_queryset(queryset=user_list,request=request,view=self)#把数据放在分页器上面
    #         print('分页数据',page_user_list)
    #         ser=IndexSerializer(instance=page_user_list,many=True)#序列化数据
    #         ret={
    #             'code':111,
    #             'data':ser.data
    #         }
    #         # return Response(ret)#这个不会显示上一页和下一页
    #         # return  p1.get_paginated_response(ret)#这个会显示上一页和下一页
    #         return  p1.get_paginated_response(ser.data)#这个会显示上一页和下一页

    2.视图

    自定义URL:

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^user/$', views.TestView.as_view()),
    ]
    from django.shortcuts import render
    from  rest_framework.views import  APIView
    from  rest_framework.request import Request
    from  rest_framework.pagination import  CursorPagination
    from rest_framework.serializers import Serializer
    from rest_framework import viewsets
    from  rest_framework.response import Response
    from app01.serializer import IndexSerializer
    from app01 import  models
    
    # Create your views here.
    
    
    class TestView(APIView):
    
        # serializer_class = IndexSerializer
        def get(self,request,*args,**kwargs):
            user_list = models.UserInfo.objects.all()
            print(user_list)
            ser=IndexSerializer(instance=user_list,many=True)
            print(type(ser))
    
            return  Response([1,2,3])
        def retrieve(self,request,*args,**kwargs):
              pass
        def create(self,request,*args,**kwargs):
              pass

    方法二:

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^user/$', views.TestView.as_view({'get': 'list', 'post': 'create'})),
        url(r'^user/(?P<pk>d+)/$',views.TestView.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
    ]
    from rest_framework import viewsets
    from  rest_framework.response import Response
    from app01.serializer import IndexSerializer
    from app01 import  models
    
    class TestView(viewsets.GenericViewSet):
        queryset = models.UserInfo.objects.all()
        serializer_class = IndexSerializer
        def list(self,request,*args,**kwargs):
    
            return  Response('......')
        def retrieve(self,request,*args,**kwargs):
              pass
        def create(self,request,*args,**kwargs):
              pass

    方式三:

    from django.conf.urls import url,include
    from rest_framework import routers
    from  . import  views
    routers=routers.DefaultRouter()
    routers.register(r'user',views.TestView)
    urlpatterns=[
        url(r'^',include(routers.urls)),
    ]
    from rest_framework.viewsets import  ModelViewSet
    from rest_framework import  serializers
    from  app01 import  models
    from rest_framework import viewsets
    class UserSeriallizer(serializers.ModelSerializer):
        class Meta:
            model=models.UserInfo
            fields=('username','password')
    class TestView(viewsets.ModelViewSet):
        queryset = models.UserInfo.objects.all()
        serializer_class = UserSeriallizer

    3.路由

    有三种情况:

    一:普通版

    from django.conf.urls import url,include
    from  rest_framework.routers import DefaultRouter
    
    
    from  . import views
    urlpatterns = [
        url(r'^user/',views.IndexView.as_view()),
        url(r'^user.(?P<format>[a-z0-9]+)/$',views.IndexView.as_view()),
        url(r'^user/(?P<pk>d+)/$',views.IndexView.as_view()),
        url(r'^user/(?P<pk>d+).(?P<format>[a-z0-9]+)/$',views.IndexView.as_view()),
    ]
    from django.shortcuts import render
    from rest_framework.views import APIView
    from  rest_framework.response import Response
    from rest_framework import viewsets
    from app01 import models
    from app01.serializer import IndexSerializer
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer,AdminRenderer
    from rest_framework.pagination import PageNumberPagination
    
    
    # Create your views here.
    
    class IndexView(APIView):
        renderer_classes = [JSONRenderer,AdminRenderer,]
    
        def get(self, request, *args, **kwargs):
            print(self.renderer_classes)
            return Response({'name':'frank'})#Admin必须返回一个键值对形式的值
            # return Response('.......')
    
        def delete(self, request, *args, **kwargs):
            return Response('.....')

    二:半自动URl

    # urlpatterns = [
    #
        # url(r'^user/$',views.IndexView.as_view({'get':'list','post':'create'})),
    #     url(r'^user/.(?P<format>[a-z0-9]+)/$',views.IndexView.as_view({'get':list,'post':'create'})),
    #     url(r'^user/(?P<pk>d+)/$',views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
    #     url(r'^user/(?P<pk>d+).(?P<format>[a-z0-9]+)/$',views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
    # ]
    class P2(PageNumberPagination):
        #每页显示的数据条数
        page_size =2 #每页显示的多少
        page_size_query_param = 'size'#关键字
        max_page_size = 5 #每页最多显示多少个
        #页码
        page_query_param = 'page'#页码是从1开始的,也是关键字
    class IndexView(viewsets.ModelViewSet):
        # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
        queryset = models.UserInfo.objects.all()
        serializer_class =IndexSerializer
        pagination_class = P2
    from  rest_framework import serializers
    from  app01 import  models
    
    class IndexSerializer(serializers.ModelSerializer):
            class Meta:
                model = models.UserInfo
                fields = '__all__'

    全自动URL:

    from django.conf.urls import url,include
    from  rest_framework.routers import DefaultRouter
    
    
    from  . import views
    # urlpatterns = [
    #     url(r'^user/',views.IndexView.as_view()),
    #     url(r'^user.(?P<format>[a-z0-9]+)/$',views.IndexView.as_view()),
    #     url(r'^user/(?P<pk>d+)/$',views.IndexView.as_view()),
    #     url(r'^user/(?P<pk>d+).(?P<format>[a-z0-9]+)/$',views.IndexView.as_view()),
    # ]
    #半自动
    # urlpatterns = [
    # 
    #     url(r'^user/$',views.IndexView.as_view({'get':'list','post':'create'})),
    #     url(r'^user/.(?P<format>[a-z0-9]+)/$',views.IndexView.as_view({'get':list,'post':'create'})),
    #     url(r'^user/(?P<pk>d+)/$',views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
    #     url(r'^user/(?P<pk>d+).(?P<format>[a-z0-9]+)/$',views.IndexView.as_view({'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
    # ]
    router=DefaultRouter()
    router.register('index',views.IndexView)
    urlpatterns=[
        url(r'^',include(router.urls))
    ]
    from django.shortcuts import render
    from rest_framework.views import APIView
    from  rest_framework.response import Response
    from rest_framework import viewsets
    from app01 import models
    from app01.serializer import IndexSerializer
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer,AdminRenderer
    from rest_framework.pagination import PageNumberPagination
    #
    #
    # # Create your views here.
    #
    # class IndexView(APIView):
    #     renderer_classes = [JSONRenderer,AdminRenderer,]
    #
    #     def get(self, request, *args, **kwargs):
    #         print(self.renderer_classes)
    #         return Response({'name':'frank'})
    #         # return Response('.......')
    #
    #     def delete(self, request, *args, **kwargs):
    #         return Response('.....')
    
    class P2(PageNumberPagination):
        #每页显示的数据条数
        page_size =2 #每页显示的多少
        page_size_query_param = 'size'#关键字
        max_page_size = 5 #每页最多显示多少个
        #页码
        page_query_param = 'page'#页码是从1开始的,也是关键字
    class IndexView(viewsets.ModelViewSet):
        # renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
        queryset = models.UserInfo.objects.all()
        serializer_class =IndexSerializer
        pagination_class = P2
    from  rest_framework import serializers
    from  app01 import  models
    
    # class IndexSerializer(serializers.Serializer):
    #     # id=serializers.IntegerField()
    #     # username=serializers.CharField()
    #     # password=serializers.CharField()
    
    class IndexSerializer(serializers.ModelSerializer):
            class Meta:
                model = models.UserInfo
                fields = '__all__'

    4.渲染器

     看到的页面是什么样子的,返回数据。

        renderer_classes = [JSONRenderer,]#返回的是一个json数据格式的没有任何外在的形式

       renderer_classes = [BrowsableAPIRenderer,]#返回的带有的页面格式

    我们一般使用这两个渲染器

    """demo URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/1.11/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.conf.urls import url, include
        2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
    """
    from django.conf.urls import url,include
    from django.contrib import admin
    
    
    urlpatterns = [
    
        url(r'^app01/(?P<version>[v1|v2]+)/', include('app01.urls')),
        url(r'^app02/(?P<version>[v1|v2]+)/', include('app02.urls')),
        url(r'^app03/(?P<version>[v1|v2]+)/', include('app03.urls')),
        url(r'^app04/(?P<version>[v1|v2]+)/', include('app04.urls')),
    ]
    from django.conf.urls import url
    
    from  . import views
    urlpatterns = [
    
        url(r'^user/',views.IndexView.as_view()),
    ]
    from app01 import models
    from  app01.serializer import IndexSerializer
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    
    class IndexView(APIView):
        renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    
        def get(self, request, *args, **kwargs):
            user_list = models.UserInfo.objects.all()
            ser = IndexSerializer(instance=user_list, many=True)
            return Response(ser.data)
  • 相关阅读:
    数据库的基本操作
    这是数据库的知识了
    这就全都是了解的东西啦
    互斥锁
    我只会用threading,我菜
    violet
    网络编程II
    网络编程
    这是网络编程的一小步,却是我的一大步
    莫比乌斯反演(一)从容斥到反演
  • 原文地址:https://www.cnblogs.com/1a2a/p/8432864.html
Copyright © 2011-2022 走看看