问题描述
我们可以在 Django Rest Framework 中将 LimitOffsetPagination 与 views.ViewSet 一起使用吗。
settings.py:
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",],"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated","DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination","PAGE_SIZE": 100,}
以下是我的列表视图的外观:
class UserViewSet(viewsets.ViewSet):
pagination_class = LimitOffsetPagination
def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
permission_classes = [IsAuthenticated]
if self.action == "list" or self.action == "retrieve":
permission_classes.append(UserReadPermission)
elif self.action == "create" or self.action == "update":
permission_classes.append(UserWritePermission)
elif self.action == "destroy":
permission_classes.append(UserDeletePermission)
return [permission() for permission in permission_classes]
def list(self,request):
serializer = UserIndexSerializer(data=request.query_params)
if serializer.is_valid():
users = User.objects.all()
serializer = UserGetSerializer(users,many=True)
response = {"users": serializer.data,"total": len(serializer.data)}
return AppResponse.success("User list found.",response)
return AppResponse.error(serializer.errors,None,http_error_code=400)
def create(self,request):
pass
def retrieve(self,request,pk=None):
pass
def update(self,pk=None):
pass
def partial_update(self,pk=None):
pass
def destroy(self,pk=None):
pass
解决方法
您可以使用 settings.py 中的以下代码为整个应用程序使用 django-rest 默认分页样式
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 50 }
如果您需要每个视图的分页,您可以按照文档进行分页
class StandardResultsSetPagination(PageNumberPagination):
page_size = 100
page_size_query_param = 'page_size'
max_page_size = 1000
然后在您的视图中使用它
class viewclass(APIView):
queryset = customquery
serializer_class = serializerclass
pagination_class = LargeResultsSetPagination
使用参数也可以帮助像
GET https://api.example.org/accounts/?limit=100&offset=400