你如何在 Django REST framework ViewSet 子类中使用分页?

Mar*_*air 5 python django django-rest-framework

我有一个简单的子类,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:
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('pombola.api.permissions.ReadOnly',),
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'PAGE_SIZE': 10,
}
Run Code Online (Sandbox Code Playgroud)

文档建议查看mixins.ListModelMixingenerics.GenericAPIView类的源代码,但我无法轻松了解如何重新应用它们为这些 ViewSet 方法对结果进行分页。

任何人都可以建议更改此示例以获取list视图分页的最简单方法是什么?

Mat*_*tko 5

您重写了 list 方法,因此它不会对您的数据进行分页。
如果你检查一下,ListModelMixins我想这可能是你的答案:

class SittingViewSet(
    viewsets.GenericViewSet,
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin):

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(
            Sitting.objects.order_by('id')
        )

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = SittingSerializer(
                page, 
                many=True, 
                context={'request': request}
                )
            return self.get_paginated_response(serializer.data)

        serializer = SittingSerializer(
                queryset, 
                many=True, 
                context={'request': request}
                )
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)