【问题标题】:Get unpaginated results from Django REST Framework从 Django REST Framework 获取未分页的结果
【发布时间】:2016-08-03 00:41:37
【问题描述】:

我默认启用了分页,它基于PageNumberPagination;到目前为止,这已经足够了,因为 API 仅由前端使用。现在我们尝试在它之上构建自动化,我想将完整的、未分页的结果集传递回客户端。

有没有办法禁用特定请求的分页,例如是否传递了请求参数?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我使用了类似的方法来接受答案

    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,您将获得未分页的响应。

    【讨论】:

      【解决方案2】:

      我确实使用了自定义分页类:

      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 就可以得到所有的项目了。

      【讨论】:

      • 能否详细说明?
      • 这与您想出的解决方案基本相同,但行数更少。因为我不再使用 Django,所以我不能再详细说明了。
      【解决方案3】:

      如果您使用页码分页样式,下面的解决方案可能会更好。

          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 的请求。

      【讨论】:

        【解决方案4】:

        实际上,这方面的 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函数并返回整个查询集。

        但是,文档中根本没有记录覆盖此函数,或者我只是错过了它。

        1. https://www.django-rest-framework.org/api-guide/pagination/
        2. https://github.com/encode/django-rest-framework/blob/master/rest_framework/pagination.py

        【讨论】:

          【解决方案5】:

          我通过以下方式解决这个问题:

          • 创建自己的分页类并从 PageNumberPagination 继承
          • 在 get_page_size 函数中重新定义或添加您的代码(使用 super())。

          对我来说这种情况有效:

          def get_page_size(self, request): super().get_page_size(请求) ………… self.page_size = self.max_page_size 返回 self.page_size

          【讨论】:

            【解决方案6】:

            您可以通过将请求限制设置为一个不可行的大数字来近似此值,但您需要先配置 Django:

            REST_FRAMEWORK = {
                'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
            }
            

            然后提出一个可笑的上限请求:

            GET https://api.example.org/accounts/?limit=999999999999

            LimitOffsetPagination - django-rest-framework.org

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-16
              • 2016-09-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多