Как можно сбросить кэш DRF GenericAPIView после срабатывания post_save сигнала?

Почему не удален кэш вьюхи, хотя вызов метода cache.delete_many возвращает количество удаленных ключей при срабатывании сигнала?
  • 20 ноября 2023 г. 15:59
Ответы на вопрос 1
Для сброса кэша DRF GenericAPIView после срабатывания post_save сигнала можно использовать следующий подход:

1. Импортируйте необходимые модули:

```python
from django.core.cache import cache
from django.db.models.signals import post_save
from django.dispatch import receiver
```

2. Найдите ключи кэша, связанные с вьюхой GenericAPIView, например, используя его URL или другой уникальный идентификатор. Например:

```python
def get_cache_keys():
    keys = []
    # Получение ключей кэша связанных с GenericAPIView
    # ...
    return keys
```

3. Создайте функцию-обработчик сигнала post_save, которая будет удалять найденные ключи кэша:

```python
@receiver(post_save, sender=YourModel)
def clear_cache_on_post_save(sender, instance, **kwargs):
    cache_keys = get_cache_keys()
    # Удаление найденных ключей кэша
    cache.delete_many(cache_keys)
```

4. Убедитесь, что функция-обработчик сигнала зарегистрирована приложении Django. Например, добавьте следующую строку в файле `apps.py` вашего приложения:

```python
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app_name'

    def ready(self):
        import your_app_name.signals  # Замените на путь к файлу со сигналом
```

5. Убедитесь, что файл `apps.py` вашего приложения зарегистрирован в файле `settings.py` проекта. Например, добавьте `'your_app_name.apps.YourAppConfig'` в `INSTALLED_APPS`.

Что касается вопроса о том, почему кэш вьюхи не удаляется, хотя `cache.delete_many` возвращает количество удаленных ключей, возможно, есть несколько причин:

- Проверьте правильность создания и регистрации сигнала `post_save`.
- Убедитесь, что функция-обработчик сигнала вызывается при сохранении модели.
- Проверьте корректность ключей кэша, которые возвращаются из функции `get_cache_keys`. Убедитесь, что ключи соответствуют ключам, которые используются при сохранении данных в Memcached или другом кэше.
Похожие вопросы