Django   发布时间:2022-04-10  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Django Rest Framework(分页、视图、路由、渲染器)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

<div id="cnblogs_posT_Body" class="blogpost-body">

一、分页

试问如果当数据量特别大的时候,你是怎么解决分页的?

  • 方式a、记录当前访问页数的数据id
  • 方式b、最多显示120页等
  • 方式c、只显示上一页,下一页,不让选择页码,对页码进行加密

title">1、基于limit offset 做分页(如:在url后面加上?offset=0&limit=2,即代表从第0条开始,往后取2条(即1,2))

rest_framework.pagination LimitOffsetPagination

Django Rest Framework(分页、视图、路由、渲染器)

urlpatterns = url(r url(r[v1|v2]+)/,include( ]
s.py

Django Rest Framework(分页、视图、路由、渲染器)

urlpatterns = url(rs.IndexView1.as_view()), url(rs.IndexView2.as_view()), url(rs.IndexView3.as_view()), url(rs.IndexView4.as_view()), url(rs.IndexView5.as_view()), ]

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response app01.serializes.myserializes serializes rest_framework.pagination app01 <span style="color: #008000;">#<span style="color: #008000;"> =========== 可以自己进行自定制分页,基于limitoffset===================
<span style="color: #0000ff;">class
<span style="color: #000000;"> P1(LimitOffsetPagination):
max_limit
= 3 <span style="color: #008000;">#
<span style="color: #008000;"> 最大显示3条数据,当取的条数超过3条时,只显示前3条,不会再显示后面的,这个值默认是None,即不做限制

default_limit =2 <span style="color: #008000;">#
<span style="color: #008000;"> 设置每一页显示多少条

limit_query_param = <span style="color: #800000;">'
<span style="color: #800000;">limit
<span style="color: #800000;">'
<span style="color: #008000;">#
<span style="color: #008000;"> 往后取几条

offset_query_param = <span style="color: #800000;">'<span style="color: #800000;">offset<span style="color: #800000;">' <span style="color: #008000;">#<span style="color: #008000;"> 当前所在的位置

<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)

s.py

<p class="secondtitle">2、基于页码的分页


<div class="cnblogs_code">

 rest_framework.pagination  PagenumberPagination

Django Rest Framework(分页、视图、路由、渲染器)

numberPagination): page_size = 2 page_size_query_param = page_query_param = max_page_size = 5

<span style="color: #0000ff;">class<span style="color: #000000;"> IndexView3(APIView):
<span style="color: #008000;">#<span style="color: #008000;">使用http://127.0.0.1:8080/app01/v1/index3/?page=1&page_size=1可进行判断
<span style="color: #0000ff;">def get(self,**<span style="color: #000000;">kwargs):
user_list =<span style="color: #000000;"> modelS.UserInfo.objects.all()
<span style="color: #008000;">#<span style="color: #008000;">实例化分页对象,获取数据库中的分页数据
p2 =<span style="color: #000000;"> P2()
<span style="color: #0000ff;">print<span style="color: #000000;">(p2.page_size_query_description)
page_user_list = p2.paginate_queryset(queryset=user_list,page_user_list)

    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;序列化对象</span>
    ser = Myserializes(instance=page_user_list,many=TruE)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;可允许多个</span>

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;生成分页和数据</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; return Response(ser.data) #不含上一页下一页</span>
    <span style="color: #0000ff;"&gt;return</span> p2.get_paginated_response(ser.data) <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是Response对象,有上一页下一页</span></pre>
s.py

<p class="secondtitle">3、基于cursor的分页

2可能存在性能问题,如果用户吧page给改的很大,查询速度就会很慢。还有一种页码加密的方式,

Django Rest Framework(分页、视图、路由、渲染器)

cursor的分页============ cursorPagination): cursor_query_param = cursor page_size = 2 page_size_query_param = max_page_size = 3 ordering = http://127.0.0.1:8080/app01/v1/index4/?cursor=cj0xJnA9NA%3D%3D&size=3可进行判断 get(self,** user_list = modelS.UserInfo.objects.all().order_by( p3 = P3() page_user_list = p3.paginate_queryset(queryset=user_list,view= (user_list) ser = Myserializes(instance=page_user_list,many=TruE) p3.get_paginated_response(ser.data)
s.py

title">二、视图

写视图函数可继承的几个类,我们以前经常用到的是APIView,现在我们来了解一下其他的类,其中1、3、4用到的最多

需要导入的类

rest_framework.views rest_framework.generics rest_framework.viewsets rest_framework.viewsets ModelViewSet

title">1、APIView

Django Rest Framework(分页、视图、路由、渲染器)

get(self,** user_list =S.UserInfo.objects.all() ser = Myserializes(instance=user_list,many=E) Response(ser.data)

title">2、GenericAPIView(APIView)

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.response rest_framework.generics app01 app01.serializes.myserializes serializes rest_framework.pagination max_limit = 3 default_limit =2 limit_query_param = offset_query_param = queryset =S.UserInfo.objects.all() serializer_class =serializes pagination_class = get(self,** user_list = p1 = P1() data = p1.paginate_queryset(queryset=user_list,view=self) 取分页的数据 ser = self.get_serializer(instance=data,many=TruE) Response(ser.data)

title">3、GenericViewSet(ViewSetmixin,generics.GenericAPIView)

/users/deletE /users/1/ PUT /users/1/ patch /users/1//users//users/1/
在GET请求的时候如果带ID说明查一条,如果不带则查所有

原始的

Django Rest Framework(分页、视图、路由、渲染器)

urlpatterns = url(rs.IndexView.as_view()), url(r\d+)$ ]
s.py

Django Rest Framework(分页、视图、路由、渲染器)

s.APIView): get(self,** pk = kwargs.get( post(self,** put(self,** patch(self,** delete(self,**
s.py

用了GenericViewSet这种方式的时候注意url变了

Django Rest Framework(分页、视图、路由、渲染器)

urlpatterns =,views.IndexView3.as_view({: ,:})), url(r\d+)/$,views.IndexView3.as_view({: })),
s.py

Django Rest Framework(分页、视图、路由、渲染器)

queryset =S.UserInfo.objects.all() serializer_class =serializes pagination_class = list(self,** Response( retrieve(self,** Response()

4、ModelViewSet(mixins.CreateModelmixin,mixins.RetrieveModelmixin,mixins.updateModelmixin,mixins.Destroymodelmixin,mixins.ListModelmixin,GenericViewSet)

利用ModelViewSet增删改查不用自己写了,内部把增删改查都干了,当满足不了需求的时候我们也可以自定制

Django Rest Framework(分页、视图、路由、渲染器)

urlpatterns = url(r,views.IndexView4.as_view({: , url(r772@[a-z0-9]+)/, url(r\d+)/,views.IndexView4.as_view({: ,delete: ,:update})), url(r\d+)\.(?P@H_268_772@[a-z0-9]+)/,:update ]
s.py

Django Rest Framework(分页、视图、路由、渲染器)

serializer这种方法必须要用Indexserializer(Modelserializer)这种方式序列化 numberPagination): page_size = 3 page_query_param = page_size_query_param = max_page_size = 5 serializer(Modelserializer): model =S.UserInfo fields = all__ queryset =S.UserInfo.objects.all() serializer_class =serializer pagination_class = P2
s.py

自定制

Django Rest Framework(分页、视图、路由、渲染器)

numberPagination): page_size = 3 page_query_param = page_size_query_param = max_page_size = 5 serializer(Modelserializer): model =S.UserInfo fields = all__ queryset =S.UserInfo.objects.all() serializer_class =serializer pagination_class = list(self,** retrieve(self,** destroy(self,** deletE create(self,** update(self,** partial_update(self,**

继承关系

Django Rest Framework(分页、视图、路由、渲染器)

<h1 id="lable3" class="title">三、路由
<p class="secondtitle">第一类:自定义路由


<div class="cnblogs_code">

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;"&gt;def</span> get(self,**<span style="color: #000000;"&gt;kwargs):
    </span><span style="color: #0000ff;"&gt;return</span> Response(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;...</span><span style="color: #800000;"&gt;'</span>)</pre>

title">第二类:半自动路由

url(r,views.IndexView.as_view({:,:772@[a-z0-9]+)$,url(r\d+)/$,views.IndexView.as_view({:,delete:,:update,:update\d+)\.(?P@H_268_772@[a-z0-9]+)$,s.ModelViewSet): queryset =S.UserInfo.objects.all() serializer_class =serializer pagination_class = P2

title">第三类:全自动路由,会自动生成四个url

router =s.IndexViewSet) urlpatterns =<span style="color: #0000ff;">class<span style="color: #000000;"> IndexViewSet(viewsets.ModelViewSet):
queryset
=<span style="color: #000000;"> modelS.UserInfo.objects.all()
serializer_class
=<span style="color: #000000;"> Indexserializer
pagination_class
=<span style="color: #000000;"> P2

<span style="color: #0000ff;">class<span style="color: #000000;"> Indexserializer(serializers.Modelserializer):
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
model =<span style="color: #000000;"> modelS.UserInfo
fields = <span style="color: #800000;">"<span style="color: #800000;">all<span style="color: #800000;">"

title">四、渲染器

根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:

  • http://127.0.0.1:8000/test/?format=json
  • http://127.0.0.1:8000/test.json

用户请求头:

  • Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

title">1、. json

访问URL:

  • http://127.0.0.1:8000/test/?format=json
  • http://127.0.0.1:8000/test.json
  • http://127.0.0.1:8000/test/

Django Rest Framework(分页、视图、路由、渲染器)

django.conf.urls web.views urlpatterns = url(r url(r772@[a-z0-9]+) ]
s.py

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response rest_framework serializers rest_framework.renderers .. serializer(serializers.Modelserializer): model =S.UserInfo fields = all__ renderer_classes = get(self,** user_list =S.UserInfo.objects.all() ser = Testserializer(instance=user_list,many=E) Response(ser.data)
s.py

title">2、.表格

访问URL:

  • http://127.0.0.1:8000/test/?format=admin
  • http://127.0.0.1:8000/test.admin
  • http://127.0.0.1:8000/test/

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response rest_framework serializers rest_framework.renderers .. serializer(serializers.Modelserializer): model =S.UserInfo fields = all__ renderer_classes =E) Response(ser.data)
s.py

title">3、Form表单

访问URL:

  • http://127.0.0.1:8000/test/?format=form
  • http://127.0.0.1:8000/test.form
  • http://127.0.0.1:8000/test/

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response rest_framework serializers rest_framework.renderers rest_framework.renderers rest_framework.renderers .. serializer(serializers.Modelserializer): model =S.UserInfo fields = all__ renderer_classes = get(self,** user_list =S.UserInfo.objects.all().first() ser = Testserializer(instance=user_list,many=falsE) Response(ser.data)
s.py

title">4、 自定义显示模板

访问URL:

  • http://127.0.0.1:8000/test/?format=html
  • http://127.0.0.1:8000/test.html
  • http://127.0.0.1:8000/test/

Django Rest Framework(分页、视图、路由、渲染器)

django.conf.urls ]
s.py

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response rest_framework serializers rest_framework.renderers .. serializer(serializers.Modelserializer): model =S.UserInfo fields = all__ renderer_classes = get(self,** user_list =S.UserInfo.objects.all().first() ser = Testserializer(instance=user_list,many=falsE) Response(ser.data,template_name=user_detail.html)
s.py
4687-b0fe-9d7cd0a61b16')">

Django Rest Framework(分页、视图、路由、渲染器)

4687-b0fe-9d7cd0a61b16" class="cnblogs_code_hide">
 @H_772_1577@
 >
 
     >
     <a href="http://code.js-code.com/tag/titl/" target="_blank" class="keywords">titl</a>e
 
 
 {{ user }}
 {{ pwd }}
 {{ ut }}
 
 
l.html

title">5、浏览器格式API+JSON

访问URL:

  • http://127.0.0.1:8000/test/?format=api
  • http://127.0.0.1:8000/test.api
  • http://127.0.0.1:8000/test/

Django Rest Framework(分页、视图、路由、渲染器)

rest_framework.views rest_framework.response rest_framework serializers rest_framework.renderers rest_framework.renderers .. serializer(serializers.Modelserializer): model =S.UserInfo fields = all__ renderer_classes = get(self,** user_list =S.UserInfo.objects.all().first() ser = Testserializer(instance=user_list,many=falsE) Response(ser.data,template_name=user_detail.html)
s.py

注意:如果同时多个存在时,自动根据URL后缀来选择渲染器。

大佬总结

以上是大佬教程为你收集整理的Django Rest Framework(分页、视图、路由、渲染器)全部内容,希望文章能够帮你解决Django Rest Framework(分页、视图、路由、渲染器)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:
猜你在找的Django相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap