解决django rest-framework page_size无效问题

项目里使用了rest-framework框架,并在settings里做了下面的全局设置

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

在调用接口的时候,

http://localhost:9090/api/cluste/?page_size=500

接口并没有返回500条数据(库里有超过500条数据),而是返回来10条记录,这就跟我想要的结果有所不同了,看一下page类的源码。

class PageNumberPagination(BasePagination):
    """
    A simple page number based style that supports page numbers as
    query parameters. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&page_size=100
    """
    # The default page size.
    # Defaults to `None`, meaning pagination is disabled.
    page_size = api_settings.PAGE_SIZE
    
    # Client can control the page using this query parameter.
    page_query_param = 'page'

    # Client can control the page size using this query parameter.
    # Default is 'None'. Set to eg 'page_size' to enable usage.
    page_size_query_param = None

    # Set to an integer to limit the maximum page size the client may request.
    # Only relevant if 'page_size_query_param' has also been set.
    max_page_size = None

page_size_query_param : 一个字符串值,指定查询参数的名称,允许客户端根据每个请求设置页面大小。默认为 None,表示客户端可能无法控制所请求的页面大小。
max_page_size : 一个数字值,表示允许的最大页面大小。该属性仅在 page_size_query_param 也被设置时有效。

而这里 page_size_query_param 的默认值是None,并不是“page_size”,所以无论“page_size”是500,是1000,都是不起作用的,那么问题就找到了,我们需要重写一个分页类

from rest_framework.pagination import PageNumberPagination

class GlobalPageNumberPagination(PageNumberPagination):
    def __init__(self):
        super(GlobalPageNumberPagination, self).__init__()
        self.page_size_query_param = 'page_size'
        self.max_page_size = 100  # 这个设置很重要
 
 settings.py里改成
 'DEFAULT_PAGINATION_CLASS': 'lib.pagination.GlobalPageNumberPagination',

这里还发现一个问题,如果在上面的类里不设置 self.max_page_size = 100的话,我的请求page_size=500时,接口是会给我返回500条记录,这是不对的,settings里的’MAX_PAGE_SIZE’: 100 是无效的么?
于是我在GlobalPageNumberPagination类里设置了self.max_page_size = 100,我再次请求page_size=500时,接口返回给我100条的记录了,这是正确的返回。

所以我觉得rest-framework 的PageNumberPagination类里的 page_size_query_param = None 的设置是一个错误的默认赋值,应该默认设置成 page_size_query_param = ‘page_size’,如果开发者不适用page_size的话,可以自己去重写PageNumberPagination类

你可能感兴趣的:(框架)