微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

一、分页

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

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

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 获取url参数中设置的每页显示数据条数 page_size_query_param = 获取url中传入的页码key 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;<a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a><a href="/tag/fenye/" target="_blank" class="keywords">分页</a>和数据</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; return Response(ser.data) #不含<a href="/tag/shangyiye/" target="_blank" class="keywords">上一页</a><a href="/tag/xiayiye/" target="_blank" class="keywords">下一页</a></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对象,有<a href="/tag/shangyiye/" target="_blank" class="keywords">上一页</a><a href="/tag/xiayiye/" target="_blank" class="keywords">下一页</a></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,**kwargs): 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,**kwargs): 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 默认是None default_limit =2 显示多少条 limit_query_param = offset_query_param = queryset = serializer_class = pagination_class = get(self,**kwargs): 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说明查一条,如果不带则查所有

原始的

404e-864b-66ce50f84745')">

404e-864b-66ce50f84745" class="cnblogs_code_hide">
 urlpatterns = 
     url(r     url(r\d+)$ ]

get(self,**kwargs): pk = kwargs.get( 获取单条信息 获取列表信息 post(self,**kwargs): put(self,**kwargs): patch(self,**kwargs): delete(self,**kwargs):

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

urlpatterns =,views.IndexView3.as_view({: ,:})),函数,post方式执行create函数 url(r\d+)/$,views.IndexView3.as_view({: })),函数

queryset = serializer_class = pagination_class = list(self,**kwargs): 获取列表信息 Response( retrieve(self,**kwargs): 获取单条数据 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]+)/,页面上显示成json格式 url(r\d+)/,views.IndexView4.as_view({: ,: ,:})),删除,修改数据 url(r\d+)\.(?P[a-z0-9]+)/,: ]

方法必须要用IndexSerializer(ModelSerializer)这种方式序列化 page_size = 3 显示的条数 page_query_param = 获取参数中传入的页码 page_size_query_param = 获取url参数中每页显示的数据条数 max_page_size = 5 Meta: model = fields = queryset = serializer_class = pagination_class = P2

自定制

page_size = 3 显示的条数 page_query_param = 获取参数中传入的页码 page_size_query_param = 获取url参数中每页显示的数据条数 max_page_size = 5 Meta: model = fields = queryset = serializer_class = pagination_class = list(self,**kwargs): 获取get请求的所有 retrieve(self,**kwargs): destroy(self,**kwargs): 删除DELETE create(self,**kwargs): 添加数据POST update(self,**kwargs): 修改PUT partial_update(self,**kwargs): 修改PATCH

继承关系

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


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


<div class="cnblogs_code">


url(r页面显示json格式
url(r[a-z0-9]+)$
url(r\d+)/$
url(r\d+)\.(?P[a-z0-9]+)$</span><span style="color: #0000ff;"&gt;def</span> get(self,**<span style="color: #000000;"&gt;<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>):
    </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(r\d+)/$,views.IndexView.as_view({:,:,:,:\d+)\.(?P[a-z0-9]+)$,=== P2

自动路由,会自动生成四个url

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 .. Meta: model = fields = renderer_classes = get(self,**kwargs): 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 .. Meta: 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 .. Meta: model = fields = renderer_classes = get(self,**kwargs): user_list =irst() 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 .. Meta: model = fields = renderer_classes = get(self,**kwargs): user_list =irst() ser = TestSerializer(instance=user_list,many= Response(ser.data,template_name=)

> <Meta charset=> 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 browsableAPIRenderer .. Meta: model = fields = browsableAPIRenderer(browsableAPIRenderer): renderer_classes =browsableAPIRenderer,] get(self,**kwargs): user_list =irst() ser = TestSerializer(instance=user_list,many= Response(ser.data,template_name=)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐