如何在 Django REST 框架 ViewSet 子类中使用分页?

2024-01-18

我有一个简单的子类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)

但是,列表视图不会分页,就像您使用 的子类一样ModelViewSet。我正在使用的设置是:

# Django Rest Framework settings:
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('pombola.api.permissions.ReadOnly',),
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'PAGE_SIZE': 10,
}

The 文档 http://www.django-rest-framework.org/api-guide/pagination/建议查看源代码mixins.ListModelMixin https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py and 泛型.GenericAPIView https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/generics.py类,但我无法轻松了解如何重新应用它们对这些 ViewSet 方法的结果进行分页的操作。

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


您重写了 list 方法,因此它不会对您的数据进行分页。
如果你检查ListModelMixins https://github.com/tomchristie/django-rest-framework/blob/6284bceaaff0e53349131164ce5c16cda8deb715/rest_framework/mixins.py我想这可能是你的答案:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django REST 框架 ViewSet 子类中使用分页? 的相关文章

随机推荐