2016-07-25 96 views
4

由于版本3.3不再可能在视图上定义page_size,因为它已移至paginator类。 related deprecations在Django Rest框架中定义分页page_size per-view

我们的API为不同的视图定义了不同的page_sizes,添加新的paginator子类只是为了覆盖page_size属性而感到不明确。我无法在视图定义中实例化paginator类,并使用__init__方法,因为它的实例化为here。我可以覆盖这个,并使其成为一个方法返回一个实例化了正确的参数,但因为它的名字不是get_pagination_class,可能它不是一个好主意。

我的问题是什么是最简洁的方式来动态创建一个paginator类与正确的page_size属性集?

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

回答

4

可以实现的东西比较干净:


  • 假设你设定每类中的分页与 pagination_class属性。
  • 假设您在类中保留page_size属性。

  1. 在你settings.py添加全局分页设置:

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

    你可以用这个所有具有相同的页面大小的意见办理。

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

    class ACustomViewSet(mixins.ListModelMixin, 
            mixins.DestroyModelMixin, 
            viewsets.GenericViewSet): 
    
        pagination_class = PageNumberPagination 
        page_size = N 
        pagination_class.page_size = self.page_size 
    

    或者你也可以做到这一点的方法中:

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

你好约翰,我有一些麻烦,此代码,基本上我有3天了学习蟒蛇,因为我被分配来修复一个Python项目,但我仍然不太熟悉这门语言,所以我可以问你在'class ACustomViewSet'中应该在哪里定义'N'和'self'?如果我有'mixins.CreateModelMixin'而不是'mixins.DestroyModelMixin'?会有什么麻烦吗?谢谢 – Frakcool

+0

嘿@Frakcool,1)'self'在python类中不需要明确的定义。 2)'N'可以是任何正整数,表示响应每页有多少结果。3)'DestroyModelMixin'提供了一种删除方法,'CreateModelMixin'提供了一种创建方法,所以不会有任何问题,只需使用其中的一种或两种! 希望这会有所帮助:) –

+1

感谢John,从1)Python向我抛出一个'Undefined variable:self',从2和3我知道了,你认为'self'的问题是什么?我会继续寻找它,等等!我想我只能说:'pagination_class.page_size = page_size'不是吗? – Frakcool

1

我终于结束了在自定义分页进行定制。它看起来是最整齐,最简单的解决方案。

自定义分页

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) 

视图

from rest_framework.viewsets import ModelViewSet 
from rest_framework.decorators import list_route 
from .pagination import CustomPageNumberPagination 

class MyView(ModelViewSet): 

    pagination_class = CustomPageNumberPagination 

    @list_route() 
    def custom_page_size_view_1(self, request): 
     """Custom page size view 1""" 

    @list_route() 
    def custom_page_size_view_2(self, request): 
     """Custom page size view 2""" 

    @list_route() 
    def custom_page_size_view_3(self, request): 
     """Custom page size view 3"""