加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 17:20:46 所属栏目:大数据 来源:网络整理
导读:div id="cnblogs_post_body" class="blogpost-body" 一、分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a、记录当前访问页数的数据id 方式b、最多显示120页等 方式c、只显示上一页,下一页,不让选择页码,对页码进行加密 rest_framework.pa

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

一、分页

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

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

rest_framework.pagination LimitOffsetPagination

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

urlpatterns = url(r url(r url(r url(r url(r ]

rest_framework.views rest_framework.response app01.serializes.myserializes 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)

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


<div class="cnblogs_code">

 rest_framework.pagination  PageNumberPagination

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>

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

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

cursor_query_param = page_size = 2 page_size_query_param = max_page_size = 3 ordering = get(self,** user_list = models.UserInfo.objects.all().order_by( p3 = P3() page_user_list = p3.paginate_queryset(queryset=user_list,view= ( ser = MySerializes(instance=page_user_list,many=True) p3.get_paginated_response(ser.data)

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

需要导入的类

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

get(self,** user_list = ser = MySerializes(instance=user_list,many= Response(ser.data)

rest_framework.response rest_framework.generics app01 app01.serializes.myserializes rest_framework.pagination max_limit = 3 default_limit =2 limit_query_param = offset_query_param = queryset = serializer_class = 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)

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

原始的

urlpatterns = url(r url(rd+)$ ]

get(self,** pk = kwargs.get( post(self,** put(self,** patch(self,** delete(self,**

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

urlpatterns =,views.IndexView3.as_view({: ,:})), url(rd+)/$,views.IndexView3.as_view({: })),

queryset = serializer_class = pagination_class = list(self,** Response( retrieve(self,** Response()

4、ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)

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

urlpatterns = url(r,views.IndexView4.as_view({: , url(r[a-z0-9]+)/, url(rd+)/,views.IndexView4.as_view({: ,: ,:})), url(rd+).(?P[a-z0-9]+)/,: ]

page_size = 3 page_query_param = page_size_query_param = max_page_size = 5 model = fields = queryset = serializer_class = pagination_class = P2

自定制

page_size = 3 page_query_param = page_size_query_param = max_page_size = 5 model = fields = queryset = serializer_class = pagination_class = list(self,** retrieve(self,** destroy(self,** create(self,** update(self,** partial_update(self,**

继承关系

<h1 id="lable3" class="title">三、路由


<p class="secondtitle">第一类:自定义路由


<div class="cnblogs_code">


url(r
url(r[a-z0-9]+)$
url(rd+)/$
url(rd+).(?P[a-z0-9]+)$</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>

url(r,views.IndexView.as_view({:,:[a-z0-9]+)$,url(rd+)/$,views.IndexView.as_view({:,:,:,:d+).(?P[a-z0-9]+)$,=== P2

router ==<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;">"

根据 用户请求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

访问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.conf.urls web.views urlpatterns = url(r url(r[a-z0-9]+) ]

rest_framework.views rest_framework.response rest_framework rest_framework.renderers .. model = fields = renderer_classes = get(self,** user_list = ser = TestSerializer(instance=user_list,many= Response(ser.data)

访问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/

rest_framework.views rest_framework.response rest_framework rest_framework.renderers .. model = fields = renderer_classes = Response(ser.data)

访问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/

rest_framework.views rest_framework.response rest_framework rest_framework.renderers rest_framework.renderers rest_framework.renderers .. model = fields = renderer_classes = get(self,** user_list = ser = TestSerializer(instance=user_list,many= Response(ser.data)

访问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.conf.urls ]

rest_framework.views rest_framework.response rest_framework rest_framework.renderers .. model = fields = renderer_classes = get(self,** user_list = ser = TestSerializer(instance=user_list,many= Response(ser.data,template_name=)

> > Title

访问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/

rest_framework.views rest_framework.response rest_framework rest_framework.renderers rest_framework.renderers .. model = fields = renderer_classes = get(self,** user_list = ser = TestSerializer(instance=user_list,many= Response(ser.data,template_name=)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读