Кэширование ответов сериализатора в Django Rest Framework
Я использую сериализатор для получения связанных данных для определенного ресурса следующим образом:
SessionSerializer.py
def to_representation(self, instance):
response = super().to_representation(instance)
response["user"] = UserSerializer(instance.user).data
if instance.experiment:
response["experiment"] = ExperimentSerializer(instance.experiment).data
response["last_event"] = EventSerializer(instance.last_global_event).data
# fetch and return all session answers tied to this session
response["session_answers"] = instance.sessionanswer_set.values()
return response
Я также использую декораторы кэша DRF в SessionViewSet, который, кажется, работает нормально. Однако я не могу аннулировать данные кэша при обновлении экземпляра и/или при обновлении любого связанного экземпляра (например, пользователя).
Существует ли стандартная практика или документация о том, как очищать данные кэша при обновлении?
Вот как это сделал я, вы найдете и узнаете больше - я все еще учусь. Это мой views.py
from django.core.cache import cache
class stateViewSet(viewsets.ModelViewSet):
---
---
def create(self, request, format=None):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
cache.delete('STATE_CACHE_KEY')
q = state.objects.prefetch_related("states").all()
cache.set('STATE_CACHE_KEY', q, 2 * 60)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def list(self, request):
queryset = cache.get('STATE_CACHE_KEY')
if queryset is None:
queryset = self.get_queryset()
cache.set('STATE_CACHE_KEY', queryset, 2 * 60)
serializer = self.get_serializer(queryset, many =True)
return Response(serializer.data)
def destroy(self, request, *args, **kwargs):
try:
instance = self.get_object()
self.perform_destroy(instance)
q = state.objects.prefetch_related("states").all()
cache.delete('STATE_CACHE_KEY')
cache.set('STATE_CACHE_KEY', q, 2 * 60)
except Http404:
pass
return Response(status=status.HTTP_204_NO_CONTENT)
Для прослушивания изменений записей в базе данных и внесения изменений в соответствии с ними, вы можете использовать сигналы django: