分页乃是开发必备技能之一
各种花式分页,当然,那是前端的事情了,我们后端开发平凡而朴素
只能没有太多的花里胡哨,把表切一切分一分,把接口与希望交给了前端
接口进行分页其实也挺简单,今天就给大家分享一些吧!
第一个分页器,为了了解流程,我们用APIView来写:
第一步,我们先生成一个分页器:
from rest_framework.pagination import PageNumberPagination
class SelfPaginations(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
好了,十分完美
page_size = 2 代表每页两条数据
page_query_param = ‘page’ 代表?page= 这个参数的page,你要是改成p,就是?p=
page_size_query_param = ‘size’ 可临时调整每页数量
max_page_size = 5 临时调整最大数量限制
白话你们可能不懂,等会上图,先看视图
class BookView(APIView):
def get(self,request):
book = Book.objects.all() #获取queryset
paginate = SelfPaginations() #获取分页对象
page_obj = paginate.paginate_queryset(book,request) #进行分页
serialized_data = BookSerialize(page_obj,many=True) #进行序列化
return Response(serialized_data.data) #返回数据
完美,接下来请求
我们代码给的每页是两条数据
临时调整这页为3条数据
第二页数据
第一页数据要求为6条
但是可以看出,只返回了5条,因为我们设置了max_page_size =5
嗯嗯,不错不错
其实page_query_param='page’我们不设置也行,源码本就是这个参数
APIView的分页就这样
我们来看看ModelViewset怎么进行分页的把
在源码中
@property
def paginator(self):
"""
The paginator instance associated with the view, or `None`.
"""
if not hasattr(self, '_paginator'):
if self.pagination_class is None: 这里如果未None,则默认无分页
self._paginator = None
else:
self._paginator = self.pagination_class()
return self._paginator
def paginate_queryset(self, queryset):
"""
Return a single page of results, or `None` if pagination is disabled.
"""
if self.paginator is None:
return None
return self.paginator .paginate_queryset(queryset, self.request, view=self) #这段指向属性方法
可以看出 ModelViewset中应该指定pagination_class 了
与其他认证、频率、权限、响应等配置不同,他们在源码中时循环取对象
所以加一个 [ ] 在配置时
分页这明显没有
所以直接:
class BookView(viewsets.ModelViewSet):
# authentication_classes = [UserAuth]
# permission_classes = [UserPerm]
# throttle_classes = [RateThrottle]
pagination_class = SelfPaginations
renderer_classes = [JSONRenderer]
queryset = Book.objects.all()
serializer_class = BookSerialize
返回对象就行了
最终的测试结果依旧是能正常运行,这里就不贴图了
我还是贴张图把,这个分页配置通过了ListMixinModel的加持
所以返回的数据要丰富多了
又简单又丰富,ModelViewset简直完美
其实这个也有全局配置
把我们那些视图中的局部配置都注释掉,直接在settings.py中写
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':2,
}
就分页成功了,当然,你可以将SelfPaginations替换PageNumberPagination,
用我们自定义的分页器对象,SelfPaginations也是继承PageNumberPagination的
但是全部配置导致每一个接口都被分页了,所以不建议使用
分页这块就说到这里了,吼吼吼吼吼