设想在学生管理系统中,要列出所有学生信息,整个学校有5W人,这个表将会非常的长,需要后端程序从数据库中读取大量的数据,并且传递给前端。
而用户通常只需要看其中的一点点数据。这是非常大的性能浪费。
既然要分页,那么前端发送的请求中需要携带 两个信息: 每页包含多少条记录
和 需要获取第几页
我们定义列出数据请求中 添加 2个url 参数: pagesize
和 pagenum
分别对应这两个信息。
Django提供了对分页的支持,具体的信息,大家可以点击这里查看其官方文档
以列出学生的代码为例, Student
为ORM中表对应的类:
# 增加对分页的支持
from django.core.paginator import Paginator, EmptyPage
def listStudent(request):
try:
# 返回一个 QuerySet 对象 ,包含所有的表记录
qs = Student.objects.values()
# 要获取的第几页
pagenum = request.params['pagenum']
# 每页要显示多少条记录
pagesize = request.params['pagesize']
# 使用分页对象,设定每页多少条记录
pgnt = Paginator(qs, pagesize)
# 从数据库中读取数据,指定读取其中第几页
page = pgnt.page(pagenum)
# 将 QuerySet 对象 转化为 list 类型
retlist = list(page)
# total指定了 一共有多少数据
return JsonResponse({'ret': 0, 'retlist': retlist,'total': pgnt.count})
except EmptyPage:
return JsonResponse({'ret': 0, 'retlist': [], 'total': 0})
except:
return JsonResponse({'ret': 2, 'msg': f'未知错误\n{traceback.format_exc()}'})
此外,前段的页面还需要一些信息总共有多少页:
而总共有多少页,通过 pgnt.count
得到。