Search code examples
djangodjango-rest-frameworkdrf-extensions

CacheResponseMixin does not work with pagination


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?


Solution

  • 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()