CacheResponseMixin does not work with pagination

310 Views Asked by At

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?

2

There are 2 best solutions below

0
On BEST ANSWER

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()
0
On

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.