DRF 之 URL控制、解析器、响应器、版本控制、分页器
追忆似水年华 · 639浏览 · 发布于2019-07-12
url控制
基本路由写法:
url(r'^publish/', views.PublishView.as_view()),
第二种写法(只要继承了ViewSetMixin):
url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})), url(r'^publish\.(?P\w+)$', views.PublishView.as_view({'get':'list','post':'create'})), url(r'^publish/(?P\d+)$', views.PublishView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),
第三种(自动生成路由,必须继承ModelViewSet):
SimpleRouter 自动生成两条路由:
from rest_framework.routers import SimpleRouter,DefaultRouter router=SimpleRouter() router.register('publish',views.PublishView) 、、、、 url(r'', include(router.urls)),
DefaultRouter自动生成四条路由:
from rest_framework.routers import SimpleRouter,DefaultRouter router=DefaultRouter() router.register('publish',views.PublishView) 、、、、 url(r'', include(router.urls)),
解析器
解析器一般不需要修改,项目最开始全局配置一下就可以了,作用是控制我的视图类能够解析前端传过来的格式是什么样的
全局使用
在setting中配置:
REST_FRAMEWORK = { "DEFAULT_PARSER_CLASSES":[ 'rest_framework.parsers.JSONParser', ] }
局部使用
在视图类中:
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser # 默认可以解析三种格式 parser_classes=[JSONParser,]
源码流程:
1- 当调用request.data的时候去执行解析方法
2- 根据传过来的编码方式选择一个解析器对象,调用解析器对象的parser方法完成解析
响应器
一般响应器是不需要进行配置的直接使用即可
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
全局使用
在setting中配置:
'DEFAULT_RENDERER_CLASSES':[xxx,xxx]
局部使用
在视图类中配置:
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
版本控制
版本控制
全局使用
在setting中配置:
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning', 'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key
路由需要修改:
-url(r'^(?P[v1|v2]+)/test/', views.Test.as_view()),
在视图类中就可以通过:request.version取出当前访问哪个版本,相应的取执行相应版本的代码。
分页器
常规分页
基本使用:
-page=PageNumberPagination实例化产生对象 -返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据, -再序列化,序列化该返回值
四个参数:
# 每页显示多少条 page.page_size=3 # 查询指定查询哪一页的key值 page.page_query_param='xxx' # 前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条 page.page_size_query_param='size' # 控制每页最大显示多少,size如果传100,最多也是显示10 page.max_page_size=10
from rest_framework.pagination import PageNumberPagination class PublishView(APIView): def get(self,request,*args,**kwargs): #查询出所有数据 ret=models.Publish.objects.all() #实例化产生一个普通分页对象 page=PageNumberPagination() #每页显示多少条 page.page_size=3 #查询指定查询哪一页的key值 page.page_query_param='xxx' #前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条 page.page_size_query_param='size' #控制每页最大显示多少,size如果传100,最多也是显示10 page.max_page_size=10 ret_page=page.paginate_queryset(ret,request,self) #序列化 pub_ser=serializer.PublishSerializers(ret_page,many=True) #去setting中配置每页显示多少条 return Response(pub_ser.data)
偏移分页
基本使用:
-page=LimitOffsetPagination实例化产生对象 -返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据, -再序列化,序列化该返回值
四个参数:
#从标杆位置往后取几个,默认取3个,我可以指定 page.default_limit=3 #每次取得条数 page.limit_query_param='limit' #标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取 page.offset_query_param='offset' #最大取10条 page.max_limit=10
from rest_framework.pagination import LimitOffsetPagination class PublishView(APIView): def get(self, request, *args, **kwargs): ret = models.Publish.objects.all() # 实例化产生一个偏移分页对象 page = LimitOffsetPagination() #四个参数: #从标杆位置往后取几个,默认取3个,我可以指定 page.default_limit=3 #每次取得条数 page.limit_query_param='limit' #标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取 page.offset_query_param='offset' #最大取10条 page.max_limit=10 ret_page = page.paginate_queryset(ret, request, self) # 序列化 pub_ser = serializer.PublishSerializers(ret_page, many=True) # 去setting中配置每页显示多少条 return page.get_paginated_response(pub_ser.data) # return Response(pub_ser.data)
cursor游标方式
基本使用:
-page=CursorPagination实例化产生对象 -返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据, -再序列化,序列化该返回值
四个参数:
#每页显示的大小 page.page_size=3 #查询的key值 page.cursor_query_param='cursor' # 按什么排序 page.ordering='id'
注意:get_paginated_response:调用这个方法返回的数据中会有总条数,上一页地址,下一页地址
from rest_framework.pagination import CursorPagination class PublishView(APIView): def get(self, request, *args, **kwargs): ret = models.Publish.objects.all() # 实例化产生一个偏移分页对象 page = CursorPagination() #三个参数: #每页显示的大小 page.page_size=3 #查询的key值 page.cursor_query_param='cursor' # 按什么排序 page.ordering='id' ret_page = page.paginate_queryset(ret, request, self) # 序列化 pub_ser = serializer.PublishSerializers(ret_page, many=True) # 去setting中配置每页显示多少条 return page.get_paginated_response(pub_ser.data)
相关推荐
android下vulkan与opengles纹理互通
talkchan · 1175浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图
奔跑的男人 · 2175浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal
吴振华 · 869浏览 · 2019-05-09 17:15:04
在华为写了十几年代码,我为什么还没有被拿去“祭天”
追忆似水年华 · 1201浏览 · 2019-05-09 17:22:20
android 通过修改图片像素实现CircleImageView
吴振华 · 1127浏览 · 2019-05-09 22:26:56
分类专栏
最新发布
最热排行
0评论