Как использовать Filterset и paginateion в ApiView?

Я пытаюсь использовать PageNumberPagination и FilterSet в APIView. Но в моем коде возникает ошибка.

объект типа 'ListSerializer' не имеет len()

Как это реализовать?


Вот код:

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'


class MyFilter(filters.FilterSet):
    class Meta:
        model = MyModel
        fields = '__all__'


class MyAPIView(views.APIView, PageNumberPagination):

    def get(self, request, *args, **kwargs):
        filterset = MyFilter(request.query_params, queryset=MyModel.objects.all())

        if not filterset.is_valid():
            raise ValidationError(filterset.errors)

        serializer = MySerializer(instance=filterset.qs, many=True)
        paginate_queryset = self.paginate_queryset(serializer, request, view=self)

        return Response(paginate_queryset.data)

Django 3.2.6

django-filter 22.1

djangorestframework 3.12.4

Python 3.8

Применить пагинацию на ApiView

views.py

from rest_framework.pagination import PageNumberPagination
class EventNewsItems(APIView, PageNumberPagination):
    def get(self, request, pk, format=None):
        event = Event.objects.get(pk=pk)
        news = event.get_news_items().all()
        results = self.paginate_queryset(news, request, view=self)
        serializer = NewsItemSerializer(results, many=True)
        return self.get_paginated_response(serializer.data)

Не стоит пытаться сделать свой объект наследуемым от APIView и PageNumberPagination, поскольку один из них является представлением, а другой - пагинатором.
Если вы хотите максимально упростить свой код, просто используйте ListAPIView:

class MyAPIView(ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer
    filterset_class = MyFilter
    pagination_class = PageNumberPagination

Если вы хотите, чтобы эта пагинация использовалась по умолчанию, вы можете даже установить ее как стиль пагинации по умолчанию один раз, чтобы не определять ее в каждом представлении, которое ее использует.

Я изменил код и он работает

class MyAPIView(views.APIView, PageNumberPagination):

    def get(self, request):
        filterset = MyFilter(request.query_params, queryset=MyModel.objects.all())

        results = self.paginate_queryset(filterset.qs, request, view=self)
        serializer = Serializer(results, many=True)

        return self.get_paginated_response(serializer.data)
Вернуться на верх