0

I have different ViewSets for CRUD operations with entities in my project. I want to return paginated response and I created custom pagination where I overrided get_paginated_response method. For now it looks like this:

class CustomPagination(PageNumberPagination):
    page = DEFAULT_PAGE
    page_size = DEFAULT_PAGE_SIZE
    page_size_query_param = 'page_size'

    def get_paginated_response(self, data):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'total': self.page.paginator.count,
            'page': int(self.request.GET.get('page', DEFAULT_PAGE)), # can not set default = self.page
            'page_size': int(self.request.GET.get('page_size', self.page_size)),
            'results': data
        })

What I want to do is to add parameters to pagination so that fields in response would be different for different models, e.g. not "results" but "comments" for Comment model, "recipes" for Recipe model.

I've introduced a variable entity_name in my get_paginated_response method to do the following:

    def get_paginated_response(self, data, entity_name: str):
        return Response({
            'links': {
                f'next_{entity_name}_link': self.get_next_link(),
                f'previous_{entity_name}_link': self.get_previous_link()
            },
            'total': self.page.paginator.count,
            'page': int(self.request.GET.get('page', DEFAULT_PAGE)), # can not set default = self.page
            'page_size': int(self.request.GET.get('page_size', self.page_size)),
            entity_name: data
        })

I've also redefined list action in my viewset in order to pass certain value of entity_name variable:

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(
                data=serializer.data,
                entity_name='comment'
            )

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

But I am getting TypeError with this code, it is said that GenericAPIView.get_paginated_response() got an unexpected keyword argument 'entity_name'

What should I do to solve it? How to pass parameters correctly?

0 Answers0