首页 > 解决方案 > Django 管理器函数的简单缓存机制

问题描述

我有一些 Django 简单管理器函数,我想在其中缓存响应(使用 Memcached),并在模型保存/删除时使这些函数无效。我认为在 Django 社区中会有一个标准的解决方案,但我找不到,所以想检查一下我没有重新发明轮子。

这是一个使用django-cache-memoize的可能解决方案的示例

from cache_memoize import cache_memoize
from django.utils.decorators import method_decorator
from django.db.models.signals import post_save, post_delete
from django.conf import settings


class MyModel(Model):
   name = models.CharField()
   is_live = models.BooleanField()

   objects = MyModelManager()


class MyModelManager(Manager):
   @method_decorator(cache_memoize(settings.CACHE_TTL, prefix='_get_live'))
    def _get_live(self):
        return super().get_queryset().filter(is_live=True)

    def example_queryset():
        return self._get_live()


# Cache invalidation
def clear_manager_cache(sender, instance, *args, **kwargs):
        MyModel.objects._get_live.invalidate(MyModel) 

post_save.connect(clear_manager_cache, sender=MyModel, weak=False)
post_delete.connect(clear_manager_cache, sender=MyModel, weak=False)

这似乎可行,但让我印象深刻的是相当标准的 Django 模式/用例的样板。

有没有更简单的解决方案来实现类似的事情?

标签: djangocachingmemcacheddjango-managers

解决方案


推荐阅读