Django Rest';PageNumberPagination';对象没有属性';第'页;错误
我有一个基于函数的Django API,如本示例所示:Django Rest';PageNumberPagination';对象没有属性';第'页;错误,django,django-rest-framework,Django,Django Rest Framework,我有一个基于函数的Django API,如本示例所示: @api_view(['GET']) def findData(request): dataId = request.GET['dataId'] page_query_param = 'page' page_size = request.GET['page_size'] paginator = PageNumberPagination() paginator.page_size = page_size
@api_view(['GET'])
def findData(request):
dataId = request.GET['dataId']
page_query_param = 'page'
page_size = request.GET['page_size']
paginator = PageNumberPagination()
paginator.page_size = page_size
paginator.page_query_param = page_query_param
qry_set = Data.objects.all()
serializer = dataIdSerializer(qry_set, many=True)
theData= serializer.data
return Response(paginator.get_paginated_response(theData))
但我一直在犯这样的错误:
AttributeError: 'PageNumberPagination' object has no attribute 'page'
我试着设置
paginator.page_query_param = page_query_param
但还是一样的问题。请告知如何修复
谢谢使用
列表视图可能更有效,这不仅会删除大量样板代码,而且不太容易出错。您可以将paginator子类化为自己的:
class MyPaginator(PageNumberPagination):
page_size = 100
page_size_query_param = 'page_size'
max_page_size = 1000
在这里,您可以在get\u queryset
方法中过滤查询集,以仅使用满足给定条件的Data
对象
在URL中,您最终可以将其链接到。as\u view()
:
urlpatterns=[
路径('/findData',DataListView.as_view())
]
问题在于调用.paginate\u queryset()
时,页面
设置在PageNumberPagination
上
因此,您需要在paginator
上调用.paginate_queryset()
,并传递queryset
和请求
实例化序列化程序时,传递调用.paginate\u queryset()
而不是qry\u set时得到的结果
完成后,DRF将抛出另一个异常,因为您在response
中放入了paginator.get\u paginated\u response(数据)
。要解决这个问题,只需返回paginator.get\u paginated\u response(数据)
最后,您的代码将如下所示:
def findData(request):
dataId = request.GET['dataId']
page_query_param = 'page'
page_size = request.GET['page_size']
paginator = PageNumberPagination()
paginator.page_size = page_size
paginator.page_query_param = page_query_param
qry_set = Data.objects.all()
p = paginator.paginate_queryset(queryset=qry_set, request=request) # change 1
serializer = dataIdSerializer(p, many=True) # change 2
theData= serializer.data
return paginator.get_paginated_response(theData) # change 3
是否有理由使用普通视图,而不仅仅是DRF的APIView
(可以自动处理此问题)?事实上是的。我正在从C#rest移植API;前端用户界面(我无法控制)基本上是在调用端点findData。我已经有了数据的视图集,但我必须使用/findData端点。请告知是否有使用findData+APIView、ViewSet或泛型的方法。。。如果需要的话,我可以处理所有的问题,我只需要处理findData端点,UI仍然可以工作。谢谢,dataId
到底在这里做什么?看起来你“扔掉”了那个变量?对不起,它是一个过滤器。。。我使用.all简化了示例,但是真正的qry有一个过滤器(qry param)appliedRight,现在看起来您只是简单地对所有数据
对象进行分页,因此简单的列表视图
就足够了。
urlpatterns = [
path('/findData', DataListView.as_view())
]
def findData(request):
dataId = request.GET['dataId']
page_query_param = 'page'
page_size = request.GET['page_size']
paginator = PageNumberPagination()
paginator.page_size = page_size
paginator.page_query_param = page_query_param
qry_set = Data.objects.all()
p = paginator.paginate_queryset(queryset=qry_set, request=request) # change 1
serializer = dataIdSerializer(p, many=True) # change 2
theData= serializer.data
return paginator.get_paginated_response(theData) # change 3