4

I have added CacheResponseMixin from drf-extensions to my viewset, but only the first page is cached and returned for all other pages e.g. /?page=2 simply returns the results for page 1.

class ProductViewSet(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    queryset = Product.objects.filter(withdrawn=False)
    serializer_class = ProductSerializer
    pagination_class = LargeResultsSetPagination

I am using django 1.85. Is this a bug or am I missing something please?

RunLoop
  • 20,288
  • 21
  • 96
  • 151

2 Answers2

1

This is not well documented, but reading the source code (for the PaginationKeyBit class) it looks like you need to add either page_kwarg = 'page' or paginate_by_param = 'page' to your viewset class.

Tomas Walch
  • 2,245
  • 1
  • 14
  • 17
0

Final fix using a custom key constructor:

from rest_framework_extensions.cache.mixins import CacheResponseMixin
from rest_framework_extensions.key_constructor.constructors import (
    DefaultKeyConstructor
)
from rest_framework_extensions.key_constructor.bits import (
    QueryParamsKeyBit   
)

class QueryParamsKeyConstructor(DefaultKeyConstructor):
    all_query_params = bits.QueryParamsKeyBit()

class ProductViewSet(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    queryset = Product.objects.filter(withdrawn=False)
    serializer_class = ProductSerializer
    pagination_class = LargeResultsSetPagination
    list_cache_key_func = QueryParamsKeyConstructor()
RunLoop
  • 20,288
  • 21
  • 96
  • 151