当前位置: 首页 > 知识库问答 >
问题:

Django Rest 框架:在视图集上打开分页(如模型视图集分页)

相弘方
2023-03-14

我有一个这样的视图集来列出用户的数据:

class Foo(viewsets.ViewSet):

    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

我想打开分页,就像模型视图集的默认分页一样:

{
    "count": 55,
    "next": "http://myUrl/?page=2",
    "previous": null,
    "results": [{...},{...},...,{...}]
}

官方文档说:

只有在使用通用视图或视图集时,分页才会自动执行

…但我的结果集根本没有分页。如何为其分页?

共有3个答案

颛孙庆
2023-03-14

尝试提供类变量

paginate_by = 10 #This will paginate by 10 results per page.

创建一个自定义的< code >视图集,它只执行< code >列表操作,就像您当前在这里的情况一样。

class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    pass

现在,使用此自定义视图集继承您的类 Foo

class Foo(ListModelViewSet):

    paginate_by = 10

    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

这将有助于分页工作。

轩辕风华
2023-03-14

只有在使用通用视图或视图集时,分页才会自动执行

第一个障碍是将文档翻译成英语。他们想要传达的是你想要一个通用的视图集。通用视图集是从通用的ApiViews扩展而来的,通用的ApiViews有额外的类方法来分页查询集和响应。

此外,您提供了自己的list方法,但默认分页过程实际上是由mixin处理的:

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

简单的解决方案是使用框架代码:

class Foo(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer = UserSerializer

更复杂的解决方案是,如果您需要自定义列表方法,那么您应该按照您认为合适的方式编写它,但采用上述mixin代码片段的样式。

谷梁星雨
2023-03-14

对于使用DRF 3.1或更高版本的用户,他们正在更改处理分页的默认方式。看见http://www.django-rest-framework.org/topics/3.1-announcement/了解详细信息。

现在,如果您想为ModelViewSet启用分页,您可以通过在settings.py文件中设置全局分页:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100
}

或者,如果您只想将其用于一个ModelViewSet,您可以手动为该视图集设置pagination_class。

from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

class FooViewSet(viewsets.ModelViewSet):
    pagination_class = StandardResultsSetPagination

这还允许您调整仅为该视图集处理分页的方式。

DRF 3.1还引入了您可以使用的新类型的默认分页方案,例如LimitOffset和Cursor。

 类似资料:
  • 问题内容: 我已经在SO文档中编写了一个示例,以统一上述问题的答案,但是由于文档将于2017年8月8日关闭,因此,我将遵循这一广受好评和讨论的元答案的建议,并将我的示例转换为自我回答发布。 当然,我也很高兴看到任何其他方法!! 题: 我想在Django Rest Framework项目上使用非通用视图/视图集(例如:)。 当我阅读分页文档时: 仅在使用通用视图或视图集时才自动执行分页。如果您使用的

  • 嗨,我想实现,就像,我想把它放在列表中,这样每个元素都可以被刷, 在这里,和在向右滑动时将不可见,view1将像视图分页一样可见。 我尝试使用,但它在滑动时不显示隐藏视图。 为了实现这一点,我想使用源代码,viewpager.java基本上是,但是我不能将view Group添加到listview中。我尝试了swipeListView,但也没有帮助。 谁能帮助我如何实现它呢

  • 视图集 在路由决定了哪个控制器用于请求后,控制器负责理解请求并产生适当的输出。 — Ruby on Rails 文档 Django REST framework 允许将一组相关视图的逻辑组合到一个称为 ViewSet 的类中。在其他框架中,您可能会发现概念上类似的实现,名为 “Resources” 或 “Controllers” 。 ViewSet 类只是一种基于类的 View,它不提供任何处理方

  • 但是,是我所说的“域”类--我的模型可以自由引用和使用的东西。我不希望我的域和模型层知道/依赖于这样一个事实,即应用程序是使用JavaFX显示的。 我认为模型/域在这方面应该保持纯净,这是对的吗?如果是这样,使用JavaFX最好的方法是什么?例如,我是否应该以某种方式为我的域对象编写适配器类,以便用来表示它们?

  • 问题内容: 我正在使用Django REST框架,并且一直在尝试创建一个返回少量信息的视图,并将其注册到我的路由器上。 我有四个存储信息的模型,并且所有模型都有一个字段。我正在尝试创建一个视图,该视图在单个视图中返回最新的对象(基于),其中仅返回四个创建时间。 因此,视图中可能的JSON输出看起来像 我也希望在路由器上注册该视图,以便在加载API根目录时它与其余的端点一起出现。 这是我尝试使用的四

  • 我设置设置了视图页的“当前项”项,它设置了当第一次视图页导航器显示下一页时的下一页数据。 ViewPager在活动中实现,ViewPager自动获取上一个和下一个项目数据和布局视图。