Django Rest Framework-APIView分页 [英] Django Rest Framework - APIView Pagination
问题描述
我有一个非常简单的APIView
,但是我不知道如何在此处设置分页.
在这种情况下,我选择给定pk
的Event
,然后获得分配给该Event
的所有NewsItems
.
I have a very simple APIView
, but I don't know how to setup pagination here.
In this scenario I select an Event
with given pk
, then I get all the NewsItems
assigned to this Event
.
pagination_class = LimitOffsetPagination
可以正常工作. queryset = Event.objects.all()
,但不包含自定义get
:
pagination_class = LimitOffsetPagination
works OK when I define queryset at the beginning in ListCreateAPIView
, for ex. queryset = Event.objects.all()
but not with custom get
:
class EventNewsItems(APIView):
pagination_class = LimitOffsetPagination
def get(self, request, pk, format=None):
#user = request.user
event = Event.objects.get(pk=pk)
news = event.get_news_items().all()
serializer = NewsItemSerializer(news, many=True, context={'request':request})
response = Response(serializer.data, status=status.HTTP_200_OK)
return response
已解决:
def get(self, request, pk, format=None):
#user = request.user
event = Event.objects.get(pk=pk)
news = event.get_news_items().all()
paginator = LimitOffsetPagination()
result_page = paginator.paginate_queryset(news, request)
serializer = NewsItemSerializer(result_page, many=True, context={'request':request})
response = Response(serializer.data, status=status.HTTP_200_OK)
return response
推荐答案
I have created a Q&A style example on this subject.
As a sort summary:
通过利用Django Rest Frameworks源代码以及它们如何处理分页,我们在视图类中创建了相同的方法,并使用它们,就像您的解决方案使用默认方法一样:
By utilizing the Django Rest Frameworks source code and how they handle pagination, we create the same methods inside our view class and we use them, in the same way your solution uses the default methods:
取自上述文档:
Taken from the above mentioned doc:
from rest_framework.settings import api_settings
from rest_framework.views import APIView
class MyView(APIView):
queryset = OurModel.objects.all()
serializer_class = OurModelSerializer
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS # cool trick right? :)
# We need to override get method to achieve pagination
def get(self, request):
...
page = self.paginate_queryset(self.queryset)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
... Do other stuff needed (out of scope of pagination)
# Now add the pagination handlers taken from
# django-rest-framework/rest_framework/generics.py
@property
def paginator(self):
"""
The paginator instance associated with the view, or `None`.
"""
if not hasattr(self, '_paginator'):
if self.pagination_class is None:
self._paginator = None
else:
self._paginator = self.pagination_class()
return self._paginator
def paginate_queryset(self, queryset):
"""
Return a single page of results, or `None` if pagination is disabled.
"""
if self.paginator is None:
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
def get_paginated_response(self, data):
"""
Return a paginated style `Response` object for the given output data.
"""
assert self.paginator is not None
return self.paginator.get_paginated_response(data)
这篇关于Django Rest Framework-APIView分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!