Как использовать 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)