Django REST Framework中APIView实现分页功能的解决方法
解决方法
DRF的全局分页配置仅对GenericAPIView及其子类生效,基础APIView不会自动触发分页逻辑,可通过以下两种方案实现需求:
方案1:更换父类为GenericAPIView(推荐)
修改views.py的代码如下,即可直接复用你在settings.py中的分页配置:
from rest_framework.generics import GenericAPIView # 原有导入保持不变 class BookListView(GenericAPIView): serializer_class = SalerListSerializer # 若需要单独给这个接口设置单页数量,可取消下一行注释 # pagination_class = PageNumberPagination # 替换为你实际使用的分页类 # page_size = 10 def get(self, request): author = set([item.get('ID') for item in Author.objects.values('ID').all()]) saler = set([item.get('name') for item in Saler.objects.values('name').all()]) if author: salers = Saler.objects.filter(name__in=list(saler - author)) else: salers = Saler.objects.all() # 调用分页方法处理查询集 page_salers = self.paginate_queryset(salers) serializer = self.get_serializer(page_salers, many=True) # 返回分页格式的响应 return self.get_paginated_response(serializer.data)
注意:如果你需要单页展示10条,需要先把
settings.py里的PAGE_SIZE配置从100修改为10。
方案2:基础APIView手动调用分页器
如果不想修改原有父类,可手动实例化分页类处理数据:
from rest_framework.pagination import PageNumberPagination # 替换为你settings中配置的分页类 # 原有导入保持不变 class BookListView(APIView): def get(self, request): author = set([item.get('ID') for item in Author.objects.values('ID').all()]) saler = set([item.get('name') for item in Saler.objects.values('name').all()]) if author: salers = Saler.objects.filter(name__in=list(saler - author)) else: salers = Saler.objects.all() # 手动初始化分页器 paginator = PageNumberPagination() paginator.page_size = 10 # 直接指定单页数量,不需要改全局配置 page_salers = paginator.paginate_queryset(salers, request) serializer = SalerListSerializer(page_salers, many=True) return paginator.get_paginated_response(serializer.data)
两种方案实现后,Swagger页面都会自动识别分页参数,支持输入页码查询对应页面的数据。
内容的提问来源于stack exchange,提问作者lodo_dev
相关产品推荐
相关产品推荐

