Каков наилучший подход к использованию кэша в Django?

<
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
    
class DemoView(APIView):
    def get(self, request):
        user_id = request.query_params.get('user_id', None)
        num = MyModel.objects.get(id=user_id).num
        for i in range(num):
            num = num*i + 1. # In real work, much more complicated.
        return Response({'success': True, 'square':num}, status=status.HTTP_200_OK)
   
    def post(self, request):
        user_id = request.data.get('user_id', None)
        num = request.data.get('num', None)
        num_from_my_model =  MyModel.objects.get(id=user_id).num
        if num == num_from_my_model:
            MyModel.objects.filter(id=user_id).update(num=num) 
        return Response({'success': True}, status=status.HTTP_200_OK)

У меня есть GET и

запрос в .

(1) Прежде всего, я создаю базу данных MyCache, чтобы посмотреть, изменился ли num в методе POST.

(2) Если изменить, MyCache переведет параметр cache_changed в значение True (по умолчанию False).

(3) В методе GET я проверю, является ли cache_changed истиной. Если True, я сохраню результат в кэш. Если False, то я получу результат из кэша.

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.core.cache import cache
    
class DemoView(APIView):
    @method_decorator(cache_page(60))
    def get(self, request):
        user_id = request.query_params.get('user_id', None)
        cache_changed = MyCache.objects.get(id=user_id).cache_changed
        if cache_changed:
           num = MyModel.objects.get(id=user_id).num
           for i in range(num):
               num = num*i + 1.
           cache.set('result', num)
        else:
           num = cache.get('result')
        return Response({'success': True, 'result':num}, status=status.HTTP_200_OK)
   
    def post(self, request):
        user_id = request.data.get('user_id', None)
        num = request.data.get('num', None)
        num_from_my_model =  MyModel.objects.get(id=user_id).num
        if num == num_from_my_model:
            MyModel.objects.filter(id=user_id).update(num=num)
            MyCache.objects.filter(id=user_id).update(cache_changed=True)    
        return Response({'success': True}, status=status.HTTP_200_OK)

Насколько я понимаю, если послано два или более GET запроса, то второй или более поздний запрос может быть удовлетворен быстрее. Поскольку я очень новичок в кэшировании, я не знаю, является ли это лучшим подходом для такого рода задач. Я буду очень рад, если кто-нибудь сможет дать мне совет.

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