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)