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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM