在Django Rest Fram中定义分页页面大小

2024-04-19 22:55:22 发布

您现在位置:Python中文网/ 问答频道 /正文

由于版本3.3在视图上定义页面大小不再可能,因为它被移到paginator类中。related deprecations

我们的API为不同的视图定义了不同的page_大小,添加新的paginator子类只是为了覆盖page_size属性,这让人感觉很模糊。我不能在视图定义中实例化paginator类,也不能像实例化的那样使用__init__方法。我可以重写它并使它成为一个方法,它返回一个用正确的参数实例化的实例,但是由于它的名称不是get_pagination_class,这可能不是一个好主意。在

我的问题是,动态创建带有正确的page_size属性集的paginator类的最干净的方法是什么?在

我见过this问题,我想避免它的两个解决方案。在


Tags: 实例方法版本视图apisize属性定义
2条回答

你可以做一些相对干净的事情:


  • 假设您使用 pagination_class属性。在
  • 假设您在类中保留page_size属性。在

  1. settings.py中添加一个全局分页设置:

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': default_page_size,
    

    您可以处理具有相同页面大小的所有视图。

  2. 对于任何其他视图/视图集:

    ^{2}$

    也可以在方法内部执行此操作:

    def list(self, request, *args, **kwargs):
        self.pagination_class.page_size = self.page_size 
        ...
    

最后我在一个自定义分页中定制了它。这似乎是最简洁、最不老套的解决方案。在

自定义分页

from rest_framework import pagination

class CustomPageNumberPagination(pagination.PageNumberPagination):
    """Custom page number pagination."""

    page_size = 30
    max_page_size = 10000
    page_size_query_param = 'page_size'

    def get_page_size(self, request):
        """Get page size."""
        # On certain pages, force custom/max page size.
        try:
            view = request.parser_context['view']
            if view.action in [
                'custom_page_size_view_1',
                'custom_page_size_view_2',
                # ...
                'custom_page_size_view_n',
            ]:
                return self.max_page_size
        except:
            pass

        return super(CustomPageNumberPagination, self).get_page_size(request)

视图

^{2}$

相关问题 更多 >