大佬教程收集整理的这篇文章主要介绍了Django Rest Framework(分页、视图、路由、渲染器),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<div id="cnblogs_posT_Body" class="blogpost-body">
试问如果当数据量特别大的时候,你是怎么解决分页的?
title">1、基于limit offset 做分页(如:在url后面加上?offset=0&limit=2,即代表从第0条开始,往后取2条(即1,2))
<span style="color: #0000ff;">class<span style="color: #000000;"> IndexView2(APIView):
<span style="color: #008000;">#<span style="color: #008000;">使用http://127.0.0.1:8080/app01/v1/index2/?offset=2&limit=4可进行判断
<span style="color: #0000ff;">def get(self,request,*args,**<span style="color: #000000;">kwargs):
user_list =<span style="color: #000000;"> modelS.UserInfo.objects.all()
p1 = P1()<span style="color: #008000;">#<span style="color: #008000;">注册分页
page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=<span style="color: #000000;">self)
<span style="color: #0000ff;">print(<span style="color: #800000;">'<span style="color: #800000;">打印的是分页的数据<span style="color: #800000;">'<span style="color: #000000;">,page_user_list)
ser = Myserializes(instance=page_user_list,many=TruE) <span style="color: #008000;">#<span style="color: #008000;">可允许多个
<span style="color: #008000;">#<span style="color: #008000;"> return Response(ser.data) #不含上一页下一页
<span style="color: #0000ff;">return<span style="color: #000000;"> p1.get_paginated_response(ser.data)
=======================也可以用下面这种形式===========
<span style="color: #0000ff;">class<span style="color: #000000;"> BaseResponse(object):
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,code=1000,data=None,error=<span style="color: #000000;">NonE):
self.code =<span style="color: #000000;"> code
self.data =<span style="color: #000000;"> data
self.error =<span style="color: #000000;"> error
<span style="color: #0000ff;">class<span style="color: #000000;"> IndexView(views.APIView):
<span style="color: #800000;">'''<span style="color: #800000;">第二种类表示的方式<span style="color: #800000;">'''
<span style="color: #0000ff;">def get(self,**<span style="color: #000000;">kwargs):
ret =<span style="color: #000000;"> BaseResponse()
<span style="color: #0000ff;">try<span style="color: #000000;">:
user_list =<span style="color: #000000;"> modelS.UserInfo.objects.all()
p1 =<span style="color: #000000;"> P1()
page_user_list = p1.paginate_queryset(queryset=user_list,view=<span style="color: #000000;">self)
ser = Indexserializer(instance=page_user_list,many=<span style="color: #000000;">TruE)
ret.data =<span style="color: #000000;"> ser.data
ret.next = p1.get_next_link() <span style="color: #008000;">#<span style="color: #008000;">下一页链接
<span style="color: #0000ff;">except<span style="color: #000000;"> Exception as e:
ret.code= 1001<span style="color: #000000;">
ret.error = <span style="color: #800000;">'<span style="color: #800000;">xxxx错误<span style="color: #800000;">'
<span style="color: #0000ff;">return Response(ret.<span style="color: #800080;">Dict)
<p class="secondtitle">2、基于页码的分页
rest_framework.pagination PagenumberPagination
<span style="color: #0000ff;">class
<span style="color: #000000;"> IndexView3(APIView): </span><span style="color: #008000;">#</span><span style="color: #008000;">序列化对象</span>
ser = Myserializes(instance=page_user_list,many=TruE) <span style="color: #008000;">#</span><span style="color: #008000;">可允许多个</span>
<span style="color: #008000;">#</span><span style="color: #008000;">生成分页和数据</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> return Response(ser.data) #不含上一页下一页</span>
<span style="color: #0000ff;">return</span> p2.get_paginated_response(ser.data) <span style="color: #008000;">#</span><span style="color: #008000;"> 是Response对象,有上一页下一页</span></pre>
<p class="secondtitle">3、基于cursor的分页
2可能存在性能问题,如果用户吧page给改的很大,查询速度就会很慢。还有一种页码加密的方式,
写视图函数可继承的几个类,我们以前经常用到的是APIView,现在我们来了解一下其他的类,其中1、3、4用到的最多
需要导入的类
title">1、APIView
title">2、GenericAPIView(APIView)
title">3、GenericViewSet(ViewSetmixin,generics.GenericAPIView)
原始的
用了GenericViewSet这种方式的时候注意url变了
4、ModelViewSet(mixins.CreateModelmixin,mixins.RetrieveModelmixin,mixins.updateModelmixin,mixins.Destroymodelmixin,mixins.ListModelmixin,GenericViewSet)
利用ModelViewSet增删改查不用自己写了,内部把增删改查都干了,当满足不了需求的时候我们也可以自定制
自定制
继承关系
<h1 id="lable3" class="title">三、路由
<p class="secondtitle">第一类:自定义路由
http://127.0.0.1:8000/api/v1/auth/
url(rs.AuthView.as_view()),http://127.0.0.1:8000/api/v1/auth.json # 想要让页面显示json格式
url(r772@[a-z0-9]+)$http://127.0.0.1:8000/api/v1/auth/1/
url(r\d+)/$http://127.0.0.1:8000/api/v1/auth/1.json
url(r\d+)\.(?P@H_268_772@[a-z0-9]+)$s.APIView):
</span><span style="color: #0000ff;">def</span> get(self,**<span style="color: #000000;">kwargs):
</span><span style="color: #0000ff;">return</span> Response(<span style="color: #800000;">'</span><span style="color: #800000;">...</span><span style="color: #800000;">'</span>)</pre>
title">第二类:半自动路由
title">第三类:全自动路由,会自动生成四个url
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:
用户请求头:
title">1、. json
访问URL:
title">2、.表格
访问URL:
title">3、Form表单
访问URL:
title">4、 自定义显示模板
访问URL:
@H_772_1577@
>
>
title
{{ user }}
{{ pwd }}
{{ ut }}
title">5、浏览器格式API+JSON
访问URL:
注意:如果同时多个存在时,自动根据URL后缀来选择渲染器。
以上是大佬教程为你收集整理的Django Rest Framework(分页、视图、路由、渲染器)全部内容,希望文章能够帮你解决Django Rest Framework(分页、视图、路由、渲染器)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。