序幕:
我在多个帖子中看到了这个问题:
并且也可以在这里应用:
我已经在SO文档中编写了一个示例,以便在上述问题中统一我的答案,但由于文档将于2017年8月8日关闭,我将遵循这个广泛上升和讨论的元答案的建议并将我的示例转换为自我回答帖子.
当然,我也很高兴看到任何不同的方法!
题:
我想APIView在Django Rest Framework项目中使用非通用视图/视图集(例如:) .
当我阅读分页文档时:
只有在使用通用视图或视图集时,才会自动执行分页.如果您使用常规
APIView,则需要自己调用分页API以确保返回分页响应.有关示例,请参阅mixins.ListModelMixin和generics.GenericAPIView类的源代码.
我还可以继续使用非通用视图/视图集吗?
我怎样才能实现分页呢?
我有一个简单的子类,viewsets.ViewSet它看起来像:
from rest_framework import viewsets
from rest_framework.response import Response
from ..models import Entry, Sitting, Source, Venue
from .serializers import (
SittingSerializer, SittingWithEntriesSerializer,
)
class SittingViewSet(viewsets.ViewSet):
def list(self, request, version=None):
queryset = Sitting.objects.order_by('id')
serializer = SittingSerializer(
queryset, many=True, context={'request': request}
)
return Response(serializer.data)
def retrieve(self, request, pk=None, version=None):
prefetch_qs = Entry.objects.select_related('speaker')
queryset = Sitting.objects.order_by('id') \
.prefetch_related(Prefetch('entry_set', queryset=prefetch_qs))
sitting = get_object_or_404(queryset, pk=pk)
serializer = SittingWithEntriesSerializer(
sitting, context={'request': request}
)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
但是,列表视图没有分页,就像您使用ModelViewSet. 我正在使用的设置是:
# Django Rest Framework settings: …Run Code Online (Sandbox Code Playgroud)