我已经使用 Django Rest Framework 用 Python 编写了一段代码,从数据库(MySql)获取数据并使用分页(
LimitOffSetPagination
)在浏览器中查看它。但是它工作不正常。但是当我使用 PageNumberPagination
时它工作正常伟大的。所以我发布了我的新代码。我的代码的注释部分实际上是为了PageNumberPagination
。所以就忽略它吧。请告诉我需要进行必要的更改并帮助我。出现的错误是:
异常值:index() 缺少 1 个必需的位置参数: ‘请求’
视图.py
from rest_framework.pagination import PageNumberPagination
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from rest_framework.pagination import LimitOffsetPagination
@api_view(['GET','POST'])
def index(self, request):
if request.method=='GET':
all_dataobj=fetchdata.objects.all()
page = self.paginate_queryset(all_dataobj)
if page is not None:
pserializer = self.get_fetchdataSerializers(page, many=True)
return self.get_paginated_response(pserializer.data)
pserializer = self.get_fetchdataSerializers(all_dataobj, many=True)
return Response(pserializer.data)
# paginator = StandardResultsSetPagination()
# result_page = paginator.paginate_queryset(all_dataobj, request)
# pserializer=fetchdataSerializers(result_page,many=True)
# return paginator.get_paginated_response(pserializer.data)
elif request.method=='POST':
serializer=fetchdataSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
设置.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10
}
url.py
urlpatterns = [
path('', m.index, name='index'),
]
我什至发布了我之前用于 PageNumberPagination 的 pagination.py 文件。如果需要进行任何必要的更改,请建议我,或者我应该删除整个文件???
分页.py
from rest_framework import pagination
class StandardResultsSetPagination(pagination.PageNumberPagination):
page_size = 10
page_query_param = 'page'
page_size_query_param = 'per_page'
max_page_size = 1000
实际上我自己解决了这个问题...所以想发布解决方案...它可能会对某人有所帮助...所以我发布 view.py、pagination.py 和 settings.py 文件...
视图.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .pagination import CustomPagination
@api_view(['GET','POST'])
def index(request):
if request.method=='GET':
all_dataobj=fetchdata.objects.all()
paginator = CustomPagination()
result_page = paginator.paginate_queryset(all_dataobj, request)
pserializer=fetchdataSerializers(result_page,many=True)
return paginator.get_paginated_response(pserializer.data)
elif request.method=='POST':
serializer=fetchdataSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
分页.py
class CustomPagination(pagination.LimitOffsetPagination):
default_limit = 1000
max_limit = 1000000
min_limit = 1
min_offset = 0
max_offset = 1000000
def paginate_queryset(self, queryset, request, view=None):
limit = request.query_params.get('limit')
offset = request.query_params.get('offset')
if limit:
limit = int(limit)
if limit > self.max_limit:
raise serializers.ValidationError({"limit" : ["Limit should be less
than or equal to {0}".format(self.max_limit)]})
elif limit < self.min_limit:
raise serializers.ValidationError({"limit" : ["Limit should be greater
than or equal to {0}".format(self.min_limit)]})
if offset:
offset = int(offset)
if offset > self.max_offset:
raise serializers.ValidationError({"offset" : ["Offset should be less
than or equal to {0}".format(self.max_offset)]})
elif offset < self.min_offset:
raise serializers.ValidationError({"offset" : ["Offset should be greater
than or equal to {0}".format(self.min_offset)]})
return super(self.__class__, self).paginate_queryset(queryset, request,
view)
设置.py
REST_FRAMEWORK = {
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}
另一个自定义 limitOffset 分页。我喜欢只将 url 的最后一部分传递给前端。限制和偏移量也可以由客户端控制
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.utils.urls import remove_query_param, replace_query_param
class StandardResultsSetPagination(LimitOffsetPagination):
default_limit = 6
limit_query_param = "limit"
offset_query_param = "offset"
max_limit = 50
def get_next_link(self):
if self.offset + self.limit >= self.count: # type: ignore
return None
url = replace_query_param(url="", key=self.limit_query_param, val=self.limit)
offset = self.offset + self.limit # type: ignore
return replace_query_param(url=url, key=self.offset_query_param, val=offset)
def get_previous_link(self):
if self.offset <= 0:
return None
url = replace_query_param(url="", key=self.limit_query_param, val=self.limit)
if self.offset - self.limit <= 0: # type: ignore
return remove_query_param(url=url, key=self.offset_query_param)
offset = self.offset - self.limit # type: ignore
return replace_query_param(url=url, key=self.offset_query_param, val=offset)
响应样本
{
"code": 2020,
"msg": "Success",
"data": {
"count": 15,
"next": "?limit=6&offset=6",
"prev": null,
"results": []
}
}