Django Rest';PageNumberPagination';对象没有属性';第'页;错误

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

我有一个基于函数的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
    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