Django Rest Framework(分页、视图、路由、渲染器)
<div id="cnblogs_post_body" class="blogpost-body"> 一、分页试问如果当数据量特别大的时候,你是怎么解决分页的?
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): =======================也可以用下面这种形式=========== <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)
<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
![]() 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">三、路由 <div class="cnblogs_code">
url(r
url(r[a-z0-9]+)$
url(rd+)/$
url(rd+).(?P
url(r,views.IndexView.as_view({:,:[a-z0-9]+)$,url(rd+)/$,views.IndexView.as_view({:,:,:,:d+).(?P
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:
![]() 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:
![]()
rest_framework.views rest_framework.response rest_framework
rest_framework.renderers
..
model = fields =
renderer_classes = Response(ser.data)
访问URL:
![]()
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:
![]() 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=)
![]()
>
>
访问URL:
![]()
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后缀来选择渲染器。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |