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)
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
如果您想设置默认分页值(包括最大值和参数),请执行以下操作。
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)
您的设置当然会有所不同!干杯!