我有一个这样的视图集来列出用户的数据:
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": [{...},{...},...,{...}]
}
官方文档说:
只有在使用通用视图或视图集时,分页才会自动执行
…但我的结果集根本没有分页。如何为其分页?
尝试提供类变量
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)
这将有助于分页工作。
只有在使用通用视图或视图集时,分页才会自动执行
第一个障碍是将文档翻译成英语。他们想要传达的是你想要一个通用的视图集。通用视图集是从通用的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代码片段的样式。
对于使用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自动获取上一个和下一个项目数据和布局视图。