Добавление cache.clear() для глобального сохранения в Django

#django #caching #save

#django #кэширование #Сохранить

Вопрос:

Надеюсь, кто-нибудь знает простой способ сделать это.

Возможно ли запускать функцию cache.clear() при каждом сохранении в любой модели?

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

Ответ №1:

Есть несколько способов, которыми вы могли бы это сделать.

Во-первых, вы могли бы создать общий абстрактный базовый класс, который наследуется от моделей.Модель и переопределения save чтобы очистить кэш, сделайте так, чтобы все ваши модели наследовали от этого.

Другим способом может быть использование сигналов — сигналы сохранения до и после имеют sender необязательный аргумент, если вы не укажете конкретную модель, он сработает для всех моделей.

Комментарии:

1. from django.db.models.signals import post_save from django.core.cache import cache @receiver(post_save) def clear_the_cache(**kwargs): cache.clear()

2. Я думаю, что cache.clear () очистит весь кэш вместо соответствующего кеша для конкретной модели, и из-за этого мой другой полезный кеш также будет очищен. Есть ли какое-либо решение для этого? и я также проверил документ по управлению версиями кэша. но я не понимаю, как я могу узнать ключи кэша, если я кэшировал конкретное представление.

Ответ №2:

@Daniel Rosemen. Извините, поскольку у меня небольшая репутация, я не смог удалить свой комментарий.

Спасибо, что указали мне правильное направление.

Это было так просто, как:

 from django.db.models.signals import post_save
from django.core.cache import cache

@receiver(post_save)
def clear_the_cache(**kwargs):
    cache.clear()
  

Комментарии:

1. Привет, Энди, я подумываю о применении этого к сайту django oscar. Мне интересно, как это сработало для вас? Есть ли какие-либо негативные последствия, о которых вы могли подумать?