【问题标题】:Angular and Django Rest framework. Issue with pagination in apiAngular 和 Django Rest 框架。 api中的分页问题
【发布时间】:2015-12-03 19:24:49
【问题描述】:

我有一个小问题。 在 Rest 框架设置中,我有:

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAdminUser",),
    "PAGE_SIZE": 50,
    "DEFAULT_AUTHENTICATION_CLASSES": (
        'rest_framework.authentication.BasicAuthentication',
        'banner_compare.authentication.CsrfExemptSessionAuthentication',
    )
}

在我的 API 视图中,我有这行:(我的 API 页面很少,每个页面有 50 个元素)

 "next": "http://0.0.0.0:8000/api/something/?page=2",

在角度服务中:

  .factory('Something',["$resource", function ($resource){
return $resource(
    "/api/something/:something_id/", {something_id: '@id'},
    {
        query: {
            isArray: true,
            transformResponse: function (data) {
                var items = angular.fromJson(data);
                return items.results;
            }
        },
        update: {
            method: "PUT",
        }
    },
    {
        stripTrailingSlashes: false
    }
);
}])

现在,当我尝试获取所有这些元素时

$scope.somethings = Something.query();

我只得到这 50 个第一个元素。我只从 API 获得第一页。 如果没有这样的东西,我怎么能得到所有这些元素:

"PAGE_SIZE": 50000000,

:)

但我也想在 API 视图中进行分页。

【问题讨论】:

    标签: angularjs django django-rest-framework


    【解决方案1】:

    在您的settings.py 中指定PAGINATE_BY_PARAM

    REST_FRAMEWORK = {
        [...]
        'PAGINATE_BY_PARAM': 'page_size',
    }
    

    然后您可以在任何请求上附加 &page_size=42 之类的内容。

    【讨论】:

    • &page_size=42 但我不知道这个“大小”,我总是需要得到所有。
    • 哦。对于我想要所有项目的特定查询,我使用上面的方法并设置&page_size=∞,其中∞是非常大的数字,如42000000000。是的,它不是真的∞,但如果你曾经获取420 亿行,无论如何,你的表现都很棒。如果您真的非常想获取∞,请使用bottom of this doc page的插件
    • 我尝试添加 PAGINATE_BY_PARAM,在我的控制器中我这样做了:Something.query({page_size:2000});但是还是不行
    • max_page_size 设置为什么?这限制了你吗?
    • 我没有设置 max_page_size,是吗?
    【解决方案2】:

    如果我是你,我会在从服务器检索到页面后抓取每个连续页面。这样一来,您的 Web 应用程序的响应速度也会更快,而不是等待巨大的查询。

    例如:

    $scope.grabPage = function(page) {
        page = page || 1;
        Something.query(
          {page:page},
          function(result) {
            $scope.somethings = $scope.somethings.concat(result);
            $scope.grabPage(page + 1);
          }
        );
    };
    $scope.somethings = [];
    $scope.grabPage();
    

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 2015-07-16
      • 2015-08-07
      • 1970-01-01
      • 2015-06-05
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多