关闭 Django Rest Framework ModelViewSet 的自动分页

Posted

技术标签:

【中文标题】关闭 Django Rest Framework ModelViewSet 的自动分页【英文标题】:Turn off automatic pagination of Django Rest Framework ModelViewSet 【发布时间】:2016-08-01 21:09:49 【问题描述】:

我正在使用 Django Rest Framework 的 ModelViewSet 来表达我的观点之一。 ModelViewSet 使用 ListModelMixin 自动对结果进行分页,但我不希望对结果进行分页。在我的 API 调用中,我说我想要返回多少个结果,但目前我无法在一次调用中返回超过 10 个结果。

有没有办法关闭自动分页,这样我就可以返回任意多的结果?

【问题讨论】:

ListModelMixing 非常简单,(github.com/tomchristie/django-rest-framework/blob/…) 看起来你可以编写自己的 mixin 并省略执行分页的行。 我还没有找到一种简单的方法来完全关闭分页,但我能够将 REST_FRAMEWORK 设置中的 PAGE_SIZE 设置为一个较大的数字,以便返回更多结果。 【参考方案1】:

如果您使用的是最新版本的 DRF,您只需将 pagination_class = None 添加到您的 ModelViewSet 定义中。

class MyClassBasedView(ModelViewSet):
    pagination_class = None
    ...

你也可以在这里看到一些提示https://github.com/tomchristie/django-rest-framework/issues/1390

【讨论】:

但这会删除 results 属性 @ospider 为什么需要他? 有时您希望对两个选项使用相同的视图集。在这些情况下覆盖 paginate_queryset 方法。【参考方案2】:

ModelViewSet 或 mixins.ListModelMixin 自动为我们创建分页。你可以通过 分页器 = 无

class NotesViewSet(viewsets.ModelViewSet):    
     queryset = Notes.objects.all()
     serializer_class = NotesWriteSerializer
     paginator = None

【讨论】:

【参考方案3】:

如果您希望仅针对一项操作禁用分页器:

@property
def paginator(self):
    self._paginator = super(NotesViewSet, self).paginator
    if self.action == 'the_action_you_want_pagination_disabled':
        self._paginator = None
    return self._paginator

在您的ModelViewSet 中使用它。

【讨论】:

【参考方案4】:

在 settings.py 中用于全局

REST_FRAMEWORK = 
    'DEFAULT_PAGINATION_CLASS': None,
    'PAGE_SIZE': 99999999, # a very large number

【讨论】:

以上是关于关闭 Django Rest Framework ModelViewSet 的自动分页的主要内容,如果未能解决你的问题,请参考以下文章

django rest-framework-2没有名为apps的模块[关闭]

关闭 Django Rest Framework ModelViewSet 的自动分页

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

怎么安装django rest framework

django rest framework中文介绍