Как кэшировать django rest framework (retrieve) с помощью постоянного кэша

У меня есть следующее представление Django REST:

class AnnotationViewSet(
        mixins.CreateModelMixin,
        mixins.ListModelMixin,
        mixins.RetrieveModelMixin,
        viewsets.GenericViewSet
    ):
    queryset = Annotation.objects.all()
    serializer_class = AnnotationSerializer

При использовании одного метода вызывается функция retrieve благодаря mixins.RetrieveModelMixin. Я хотел бы ускорить эту функцию, так как она требует многократных запросов и использует много CPU.
В частности:

  • Мне нужен постоянный кэш, который можно было бы использовать после перезапуска приложения
  • .
  • Кэшированные данные должны быть разными в зависимости от полученной записи (например, http://127.0.0.1/annotations/1 vs http://127.0.0.1/annotations/2 и т.д.)

На данный момент я попытался перезаписать метод представления retrieve:

    @method_decorator(cache_page(60 * 60 * 24 * 365))
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

и установить кэш по умолчанию на диск:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/home/django_cache',
    }
}

Я не думаю, что это работает, так как мне нужно кэшировать около 2 миллионов элементов (у меня около 2 миллионов записей): папка /home/django_cache использует менее Мб и ее размер меняется каждый раз, когда я вызываю API.

Вернуться на верх