如何在DRF GenericAPIView中启用分页?全局配置未生效
解决DRF GenericAPIView全局分页配置不生效的问题
嘿,我之前切换到GenericAPIView的时候也踩过这个分页的坑!先给你捋清楚为啥全局配置没生效,以及对应的解决办法:
可能的原因1:手动重写视图方法,没走DRF分页流程
如果你的GenericAPIView子类是自己编写get/post方法,而非复用DRF封装好的列表逻辑,那即便全局配置了分页,DRF也不会自动处理。比如这种写法就不会生效:
class MyModelView(GenericAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer def get(self, request, *args, **kwargs): queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
这时候需要手动调用DRF的分页方法,修改成这样:
def get(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)
可能的原因2:未使用GenericAPIView的封装子类
DRF其实已经封装好了自带分页逻辑的视图子类,比如ListAPIView——直接继承这个类的话,全局分页配置会自动生效,根本不用自己写get方法:
from rest_framework.generics import ListAPIView class MyModelView(ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer
这种写法下,你在settings.py里的全局配置会直接生效,默认每页返回5条数据。
类属性pagination_class的正确用法
你后来尝试在类里定义pagination_class,这个属性是用来覆盖全局配置的。比如某个视图需要使用不同的分页类(比如LimitOffsetPagination),或者单独设置该视图的分页规则时,才需要添加这个属性:
from rest_framework.pagination import LimitOffsetPagination class MyModelView(ListAPIView): queryset = MyModel.objects.all() serializer_class = MyModelSerializer # 覆盖全局分页类,使用偏移量分页 pagination_class = LimitOffsetPagination
最后检查全局配置的正确性
确认settings.py里的配置没有拼写错误:
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 5 }
分页类的路径和名称必须准确,否则DRF找不到对应的分页实现,配置自然不会生效。
内容的提问来源于stack exchange,提问作者Benihana
相关产品推荐
相关产品推荐

