Как кэшировать 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.