从Django REST Framework获取不合理的结果

时间:2016-04-12 11:59:38

标签: django django-rest-framework

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

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

6 个答案:

答案 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函数并返回整个查询集。

但是,在文档中根本没有记录重写此功能,或者我只是错过了它。

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

答案 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)

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

  • 创建自己的分页类并从 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

答案 4 :(得分:-1)

您可以通过将请求限制设置为不可靠的大数字来估算此值,但您需要先配置Django:

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

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

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

LimitOffsetPagination - django-rest-framework.org

答案 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即可获得所有项目。