Django drf 分页查询(批量查询)
REST framework提供了分页的支持 我们可以在配置文件中设置全局的分页方式,如:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100
}
也可单独为视图添加不同分页行为。在视图中通过pagination_clas属性来指明
class AssetsViewSet(ModelViewSet):
queryset = AssetsModel.objects.all()
permission_classes = [AllowAny]
pagination_class = LimitOffsetPagination
...
也可通过自定义Pagination类,来为视图添加不同分页行为:
class LargeResultsSetPagination(PageNumberPagination):
page_size = 1000
page_size_query_param = 'page_size'
max_page_size = 10000
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
pagination_class = LargeResultsSetPagination
注意:如果在视图内关闭分页功能,只需在视图内设置
pagination_class = None
PageNumberPagination:普通分页
前端访问网址形式:
GET http://127.0.0.1:8000/student/?page=4
使用比较常见,前端会显示出,现在总共多少页。
Django 自定义分页器
可以在子类中定义的属性:
page_size – 每页数目 page_query_param – 前端发送的页数关键字名,默认为”page” page_size_query_param – 前端发送的每页数目关键字名,默认为None max_page_size – 前端最多能设置的每页数量
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 3
page_query_param = 'page'
page_size_query_description = 'size'
max_page_size = 5
如上代码 前端请求路径:
/api/v1/asset?batch=1&batch_size=5
返回结果:
{
"count": 4,
"next": "http://127.0.0.1:8001/api/v1/asset/?batch=2&batch_size=5",
"previous": null,
"results": [
{
"id": 6,
"asset_id": "773",
"asset_type": " asset_type",
"asset_name": "aaaaa",
"mgmt_ip": "1.13.1.1",
"protocol": "bbbbb",
"tenant_id": "ggggggggg",
"description": "sssssss"
},
{
"id": 7,
"asset_id": "494",
"asset_type": " asset_type",
"asset_name": "aaaaa",
"mgmt_ip": "1.13.1.1",
"protocol": "bbbbb",
"tenant_id": "ggggggggg",
"description": "sssssss"
},
{
"id": 8,
"asset_id": "171",
"asset_type": " asset_type",
"asset_name": "cccccccccccc",
"mgmt_ip": "1.13.1.1",
"protocol": "bbbbb",
"tenant_id": "ggggggggg",
"description": "sssssss"
}
]
}
如上,是我们不复写 def list的自动返回。 如果我要自定义批量查询的返回结构呢?
自定义批量查询的返回结构
Django Rest framework 分页的使用 参考URL: https://blog.csdn.net/weixin_43603327/article/details/839615
比如,这里我想删掉 count、next、previous 字段,返回格式改成:
{
"status_code":200,
"data": {
“result”: [
{
...
}
思路: 复写 def list方法,在里面操作获取数据,组装返回给前端的结构。 推荐阅读本标题下参考URL。
class MyPageNumberPagination(PageNumberPagination):
page_size = 3
page_size_query_param = "size"
max_page_size = 10
page_query_param = "page"
class Pager1View(APIView):
def get(self,request,*args,**kwargs):
roles = models.Role.objects.all()
pg = MyPageNumberPagination()
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
ser = PagerSerialiser(instance=page_roles,many=True)
return Response({"status_code": 200, 'data': {'result':ser.data}})
LimitOffsetPagination:偏移分页
前端访问网址形式:
GET http://127.0.0.1/four/student/?limit=100&offset=400
这是veiw层,添加:
pagination_class = LimitOffsetPagination
CursorPagination:游标分页 – 速度快,但不能指定查询
Django-drf-内置分页器的使用 参考URL: https://zhuanlan.zhihu.com/p/286671626
参考
Django-drf-内置分页器的使用 参考URL: https://zhuanlan.zhihu.com/p/286671626 Django Rest framework 分页的使用 参考URL: https://blog.csdn.net/weixin_43603327/article/details/83961568
|