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

class Foo(viewsets.ViewSet):

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

我想像ModelViewSet的默认分页一样打开分页:

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

The official doc说:

仅当您使用通用视图或视图集时,才会自动执行分页

...但我的结果集根本没有分页.我怎样才能给它分页?

推荐答案

仅当您使用泛型 视图或视图集

第一个障碍是将文档翻译成英语.他们想要传达的是您想要一个通用的视图集.泛型视图集从generic 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

更复杂的解决方案是,如果您需要一个自定义的list方法,那么您应该按照您认为合适的方式编写它,但是使用上面的混合代码片段的样式.

Django相关问答推荐

查尔而不是瓦尔查尔加盟Django 球场

仅更新模型中的特定字段.Model Django

如何在Django中获取标记<;输入>;的';值';属性?

""关系"core_Boundary_summary的列user_id中的空值"违反了非空约束|失败行包含(2,title,string,null)

Django没有显示变量

覆盖保存以创建范围的多个对象()

通过 OrderingFilter 过滤平均和

如何在 createsuperuser 中实例化表

Django 表单有 Select 但也有自由文本选项?

如何在 PyCharm 中重命名 Django 元素?

如何从 django 自定义中间件类返回 rest_framework.response 对象?

Django 登录到控制台

有 Django List View 模型排序吗?

使用 Django 1.5 实现多种用户类型

使用直通模型了解 Django 中的多对多字段

如何从 Django 的 TabularInline 管理视图中省略对象名称?

在 django admin 中链接到外键对象

Django中GROUP BY中注释的聚合

使用 .order_by() 和 .latest() 的 Django 查询

从 git 存储库中删除并忽略所有具有扩展名的文件