为什么我的Django Rest Framework分页不生效,如何单独为视图配置分页?
问题排查及解决步骤
按照如下优先级逐一排查修复即可:
1. 检查是否自定义list方法跳过了分页逻辑
如果你在JobView中重写了list方法,直接返回序列化结果没有调用父类的分页逻辑,就会导致分页完全失效。正确的自定义list方法写法必须保留分页处理:
from rest_framework.response import Response class JobView(viewsets.ReadOnlyModelViewSet): # 原有配置保持不变 queryset = Job.objects.all() serializer_class = JobSerializer filter_backends = [filters.OrderingFilter, DjangoFilterBackend, filters.SearchFilter] search_fields = [...] ordering_fields = ['jobId'] ordering = ['-jobId'] filterset_fields = ['jobId', 'status'] pagination_class = StandardResultsSetPagination # 若需自定义list方法,必须保留以下分页逻辑 def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) # 调用分页处理 page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) # 无分页场景的返回 serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
如果没有自定义list方法可以跳过该步骤。
2. 补全自定义分页类的配置
你当前的分页类仅配置了page_size属性,LimitOffsetPagination的分页大小优先级是请求limit参数 > 类的default_limit属性 > 全局配置,补全配置避免参数覆盖导致失效:
from rest_framework.pagination import LimitOffsetPagination class StandardResultsSetPagination(LimitOffsetPagination): # 每页默认返回数量 default_limit = 1 # 允许前端自定义的每页最大数量,不需要可设为None max_limit = 100 # 显式指定分页参数名,和前端传参保持一致即可 limit_query_param = 'limit' offset_query_param = 'offset'
3. 确认基础配置无冲突
- 确认
JobView类没有设置pagination_class = None覆盖分页配置 - 确认settings.py中没有设置
DEFAULT_PAGINATION_CLASS = None全局关闭分页功能,不需要全局配置分页类,不设置该参数即可 - 只有GET请求访问列表路径
/jobs/才会触发分页,详情路径/jobs/{id}/本身不会分页 - 如果是
@action装饰器自定义的接口,需要手动调用上述list方法中的分页逻辑
生效验证
发起GET请求访问/jobs?limit=1,返回结果包含count、next、previous、results四个字段,results内仅返回1条数据即代表分页生效。
内容的提问来源于stack exchange,提问作者EinEsellesEniE
相关产品推荐
相关产品推荐

