【问题标题】:Caching serializer responses in Django Rest Framework在 Django Rest Framework 中缓存序列化程序响应
【发布时间】:2021-11-08 12:03:07
【问题描述】:

我正在使用序列化程序来获取特定资源的相关数据,如下所示:

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

我还在 SessionViewSet 中使用 DRF 缓存装饰器,这似乎工作正常。但是,当实例有更新和/或任何相关实例(如用户)有更新时,我不能使缓存数据无效。

是否有关于如何在更新时清除缓存数据的标准做法或文档?

【问题讨论】:

    标签: python django caching django-rest-framework django-redis


    【解决方案1】:

    我就是这样做的,您可以找到并了解更多信息 - 我仍在学习。 这是我的意见。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)
    

    【讨论】:

      【解决方案2】:

      监听数据库记录的变化并根据它们进行更改, 你可以使用 django 信号:

      https://docs.djangoproject.com/en/3.2/topics/signals/

      【讨论】:

      • 这也会更新嵌套关系吗?就像当一个用户被更新并且 Django 信号更新用户缓存时,它也会更新 Session 缓存?
      • 有一个信号叫m2m_changed。你也可以编写一个处理函数来做你想做的事情。这个link很好地解释了用法。
      猜你喜欢
      • 2019-05-23
      • 2016-12-18
      • 2017-06-04
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多