如何判断Django Ninja的PageNumberPagination是否存在下一页?
Django Ninja PageNumberPagination 判断下一页的方案
针对默认分页返回结构缺少下一页标识的问题,有两种便捷解决方式:
一、自定义分页类,直接返回下一页状态
继承官方的PageNumberPagination,重写to_response方法,在返回结果中添加has_next字段,后端直接计算好状态返回给前端:
from ninja.pagination import PageNumberPagination class CustomPageNumberPagination(PageNumberPagination): def to_response(self, request, data, **kwargs): # 执行分页逻辑 page_data = self.paginate_queryset(data, request) # 计算总页数 total_pages = (self.count + self.page_size - 1) // self.page_size # 判断是否存在下一页:当前页码 < 总页数 has_next = self.page < total_pages return { "items": page_data, "count": self.count, "has_next": has_next, "total_pages": total_pages # 可选,方便前端做页码导航 }
使用时替换原分页类即可:
from ninja.pagination import paginate from .schemas import UserSchema from .models import User @api.get('/users', response=List[UserSchema]) @paginate(CustomPageNumberPagination) def list_users(request): return User.objects.all()
二、前端通过现有字段计算下一页状态
无需修改后端,利用返回的count(总条数)、当前页码、页大小三个值,通过公式直接判断:
// 假设当前页为currentPage,页大小为pageSize,总条数为totalCount const hasNext = currentPage * pageSize < totalCount;
这个公式能覆盖所有场景:
- 当总数不是页大小整数倍时:比如总条数172,页大小20,第8页时
8*20=160 <172,存在下一页;第9页时9*20=180>172,无下一页。 - 当总数是页大小整数倍时:比如总条数180,页大小20,第9页时
9*20=180不小于180,无下一页,避免了空列表的问题。
内容的提问来源于stack exchange,提问作者Dmytro Novikov
相关产品推荐
相关产品推荐

