【发布时间】:2016-08-03 00:41:37
【问题描述】:
我默认启用了分页,它基于PageNumberPagination;到目前为止,这已经足够了,因为 API 仅由前端使用。现在我们尝试在它之上构建自动化,我想将完整的、未分页的结果集传递回客户端。
有没有办法禁用特定请求的分页,例如是否传递了请求参数?
【问题讨论】:
标签: django django-rest-framework
我默认启用了分页,它基于PageNumberPagination;到目前为止,这已经足够了,因为 API 仅由前端使用。现在我们尝试在它之上构建自动化,我想将完整的、未分页的结果集传递回客户端。
有没有办法禁用特定请求的分页,例如是否传递了请求参数?
【问题讨论】:
标签: django django-rest-framework
我使用了类似的方法来接受答案
class Unpaginatable(PageNumberPagination):
def paginate_queryset(self, queryset, request, view=None):
if request.query_params.get('get_all', False) == 'true':
return None
return super(BuildListPagination, self).paginate_queryset(queryset, request, view=view)
现在,如果您在发出请求时传递?get_all=true,您将获得未分页的响应。
【讨论】:
我确实使用了自定义分页类:
class Unpaginatable(PageNumberPagination):
def paginate_queryset(self, queryset, request, view=None):
if getattr(request, 'get_all', False):
return None
return super(BuildListPagination, self).paginate_queryset(queryset, request, view=view)
现在我只需要在我的视图中设置request.get_all = True 就可以得到所有的项目了。
【讨论】:
如果您使用页码分页样式,下面的解决方案可能会更好。
def paginate_queryset(self, queryset, request, view=None):
if 'page' not in request.query_params:
return None
return super().paginate_queryset(queryset, request, view)
所以你只需发送一个没有页面 query_param 的请求。
【讨论】:
实际上,这方面的 DRF 文档非常不清楚,也没有明确的答案来解决这个问题。阅读源代码后,以下代码对我有用。
from rest_framework.pagination import LimitOffsetPagination
class Unpaginated(LimitOffsetPagination):
def paginate_queryset(self, queryset, request, view=None):
self.count = self.get_count(queryset)
self.limit = self.get_limit(request)
self.offset = self.get_offset(request)
self.request = request
self.display_page_controls = False
return list(queryset)
class SomeViewSet(viewsets.ModelViewSet):
queryset = SomeModel.objects.all().order_by("-id")
pagination_class = Unpaginated
这里的关键是覆盖基类中的paginate_queryset函数并返回整个查询集。
但是,文档中根本没有记录覆盖此函数,或者我只是错过了它。
【讨论】:
我通过以下方式解决这个问题:
对我来说这种情况有效:
def get_page_size(self, request): super().get_page_size(请求) ………… self.page_size = self.max_page_size 返回 self.page_size
【讨论】:
您可以通过将请求限制设置为一个不可行的大数字来近似此值,但您需要先配置 Django:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}
然后提出一个可笑的上限请求:
GET https://api.example.org/accounts/?limit=999999999999
【讨论】: