默认启用分页,基于PageNumberPagination
;到目前为止这已经足够了,因为API仅用于前端。现在我们尝试在它之上构建自动化,并且我想将完整的,未涂抹的结果集传递回客户端。
是否有办法禁用特定请求的分页,例如如果传递了请求参数?
答案 0 :(得分:1)
如果您使用的是页码分页样式,则以下解决方案可能会更好。
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的请求即可。
答案 1 :(得分:0)
实际上,关于此的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
函数并返回整个查询集。
但是,在文档中根本没有记录重写此功能,或者我只是错过了它。
答案 2 :(得分:0)
我用类似的方式接受了答案
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
,则会收到未分页的响应。
答案 3 :(得分:0)
我通过以下方式解决了这个问题:
对我来说是这样的:
def get_page_size(self, request): super().get_page_size(请求) ...... self.page_size = self.max_page_size 返回 self.page_size
答案 4 :(得分:-1)
您可以通过将请求限制设置为不可靠的大数字来估算此值,但您需要先配置Django:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}
然后提出一个可笑的高限制请求:
GET https://api.example.org/accounts/?limit=999999999999
答案 5 :(得分:-1)
我确实选择了自定义分页类:
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
即可获得所有项目。