He agregado CacheResponseMixin de drf-extensions a mi conjunto de vistas, pero solo la primera página se almacena en caché y se devuelve para todas las demás páginas, p. /? page = 2 simplemente devuelve los resultados de la página 1.

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

Estoy usando django 1.85. ¿Es esto un error o me falta algo, por favor?

4
RunLoop 29 jul. 2016 a las 09:29

2 respuestas

La mejor respuesta

Solución final utilizando un constructor de claves personalizado:

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
RunLoop 30 ago. 2016 a las 09:20

Esto no está bien documentado, pero leyendo el código fuente (para la clase PaginationKeyBit) parece que necesita agregar page_kwarg = 'page' o paginate_by_param = 'page' a su clase de conjunto de vistas.

1
Tomas Walch 10 ago. 2016 a las 09:13