Django rest框架覆盖ViewSet中的page_size

Man*_*esh 16 python django django-rest-framework

我有django休息框架分页的问题.我在以下设置中设置了分页 -

'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 1
Run Code Online (Sandbox Code Playgroud)

以下是我的观点.

class HobbyCategoryViewSet(viewsets.ModelViewSet):    
    serializer_class = HobbyCategorySerializer
    queryset = UserHobbyCategory.objects.all()
Run Code Online (Sandbox Code Playgroud)

我想为此视图集设置不同的页面大小.我尝试过设置page_size和Paginate_by类变量,但是根据设置中定义的PAGE_SIZE对列表进行分页.知道我哪里错了吗?

Man*_*esh 19

我通过创建自定义分页类来修复此问题.并在课堂上设置所需的页面大小.我在我的视图中使用了这个类作为pagination_class.

from rest_framework import pagination

class ExamplePagination(pagination.PageNumberPagination):       
       page_size = 2

class HobbyCategoryViewSet(viewsets.ModelViewSet):    
    serializer_class = HobbyCategorySerializer
    queryset = UserHobbyCategory.objects.all()
    pagination_class=ExamplePagination
Run Code Online (Sandbox Code Playgroud)

我不确定是否有更简单的方法.这个对我有用.但我觉得创建新类只是为了改变page_size并不好.

编辑 - 简单的解决方案设置它

pagination.PageNumberPagination.page_size = 100 
Run Code Online (Sandbox Code Playgroud)

在ViewSet中.

class HobbyCategoryViewSet(viewsets.ModelViewSet):    
    serializer_class = HobbyCategorySerializer
    queryset = UserHobbyCategory.objects.all()
    pagination.PageNumberPagination.page_size = 100 
Run Code Online (Sandbox Code Playgroud)

  • 在不同视图集中更改 pagination.PageNumberPagination.page_size 不会导致大小不同。只设置了一个page_size (3认同)

Nar*_*esh 13

使用页面大小查询参数动态提供页面大小..

from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
    page_size_query_param = 'limit'
Run Code Online (Sandbox Code Playgroud)

在设置中设置默认分页类

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'StandardResultsSetPagination',}
Run Code Online (Sandbox Code Playgroud)

现在在您的URL中提供限制作为GET参数..

http://example.com/list/?limit=100或25


rad*_*tek 5

如果您想设置默认分页值(包括最大值和参数),请执行以下操作。

1) 创建一个drf_defaults.py(或您选择的任何名称)。我将它放在与以下相同的目录中settings.py

"""
Django rest framework default pagination
"""
from rest_framework.pagination import PageNumberPagination


class DefaultResultsSetPagination(PageNumberPagination):
    page_size = 50
    page_size_query_param = 'page_size'
    max_page_size = 100000
Run Code Online (Sandbox Code Playgroud)

2)在您的settings.py更新REST_FRAMEWORK字典中,添加以下内容:

'DEFAULT_PAGINATION_CLASS': 'drf_defaults.DefaultResultsSetPagination',
Run Code Online (Sandbox Code Playgroud)

最后我的 REST_FRAMEWORK 设置字典如下所示:

# http://www.django-rest-framework.org/api-guide/settings/
REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.AllowAny',  # Use to disable api auth
        # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
        'permissions.IsAuthenticatedWriteOrReadOnly',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 'oauth2_provider.contrib.rest_framework.OAuth2Authentication',  # Own oauth server
        'client_authentication.ApiTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
    # Enable DRF pagination
    # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'DEFAULT_PAGINATION_CLASS': 'drf_defaults.DefaultResultsSetPagination',
    'PAGE_SIZE': 50,
    'DEFAULT_RENDERER_CLASSES': (
        # 'rest_framework.renderers.JSONRenderer',  # Swapping out the original renderer
        'lib.drf_renderer.UJSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PARSER_CLASSES': (
        # 'rest_framework.parsers.JSONParser',  # Swapping out the original parser
        'lib.drf_parser.UJSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    )
}
Run Code Online (Sandbox Code Playgroud)

您的设置当然会有所不同!干杯!