Django-кэше поля является приложение Django, который обеспечивает сельдерей отложено, кэшированные поля на Django ORM для дорогих в данных Статистика
Использование Django ORM и сельдерей, держать дорогие в расчета атрибутов до современных.
Пример
Скажем, у вас медленный метод на одном из ваших моделей:
класс фонарный столб (models.Model):
& NBSP;property
& NBSP; Def slow_full_name (само):
& NBSP; сон (30)
& NBSP; возвращение "% S в% S из% S '% (self.weight, self.first_name, self.country)
Тьфу; слишком медленно. Давайте кэшировать, что. Мы хотим несколько инструментов. Сельдерей
от django_cached_field CachedIntegerField импорта, ModelWithCachedFields
класс фонарный столб (models.Model, ModelWithCachedFields):
& NBSP; slow_full_name = CachedTextField (нуль = True)
& NBSP; Def calculate_slow_full_name (само):
& NBSP; сон (30)
& NBSP; возвращение "% S в% S из% S '% (self.weight, self.first_name, self.country)
(Да, calculate_ просто условность. Я четко не дали дух рельсы ...)
Далее, перенести дБ схемы, чтобы включить новый кэширования поле, используя юг, или свернуть свой собственный. Обратите внимание, что два поля будут добавлены в эту таблицу, cached_slow_full_name типа текста и slow_full_name_recalculation_needed типа Boolean, вероятно, недобросовестный к истине.
Уже это любопытное лучше. lamppost.slow_full_name может занять 30 секунд в первый раз он вызывается для данной записи, но с тех пор, это будет почти мгновенно. Конечно, в этой точке, он никогда не будет изменить после первого звонка.
Остальные важная часть головоломки, чтобы аннулировать наш кэш. Thoses составные поля, вероятно, в какой-то изменилось views.py (это может быть более умным о замечать, если соответствующие значения обновляются):
render_to ("фонарный столб / edit.html")
Def редактировать (запрос, lamppost_id):
& NBSP; фонарный столб = Lamppost.objects.get (рк = lamppost_id)
& NBSP; если request.METHOD == 'POST':
& NBSP; форма = LamppostForm (request.POST)
& NBSP; если form.is_valid ():
& NBSP; form.save ()
& NBSP; form.instance.flag_slow_full_name_as_stale ()
& NBSP; другое:
& NBSP; форма = LamppostForm ()
& NBSP; возврат {"форма": форма, "фонарный столб": фонарный столб}
Это самая трудная часть, как разработчик! Кэширование требует от вас выследить каждое место значение может быть изменено и призывая что flag_slow_full_name_as_stale метод. Страна назначен является случайной новое значение каждое утро в cron'o'clock? Этот флаг был лучшим устаревшими по cron'o'one. Вы рассчитать вес на основе суммы всех связанных голубей? Крюк в посадке голубей. И взлет. И все, что изменяет вес отдельного голубя. Как сказал Авраам Линкольн, "Есть только два жестких проблемы в программировании: именование, кэш недействительным и не совсем по-одной ошибки."
Установка
Вы можете сделать вещи легко на себя:
Django-кэше-поле PIP установить
Или, для ручной установки, вы можете клонировать репо и установить его с помощью Python и setup.py:
Git клон Git: //github.com/aquameta/django-cached-field.git
CD Django-кэше поля /
питон setup.py установить
Протестировано с Django 1.3.1, 2.3.1, сельдерея Django-сельдерея 2.3.3.
Конфигурация
Два изменения настроек довольно много требуется для вещей в работе: убедитесь, что это зарегистрированная приложение, убедитесь, что сельдерей видит свою файл задачи:
INSTALLED_APPS + = ['django_cached_field ",]
CELERY_IMPORTS + = ['', django_cached_field.tasks]
Одно изменение является обязательным: следует ли перерасчет произойдет, когда помечен как черствый (по умолчанию) или оставить на следующий раз атрибут доступ. Это полезно для тестирования средах, где вы не волнует, что ваши ценности в кэше, являются недействительными. Обратите внимание, что в этой ситуации, вам не нужно будет сельдерей.
CACHED_FIELD_EAGER_RECALCULATION = True # или Ложь для тестирования сред
Это глобальная опция, так что отдельные исключения должны быть обработаны, а при прохождении and_recalculate аргумент вызова flag_FIELD_as_stale.
Предостережения
- Состояние гонки, если вы флаг поле, как черствый в сделке дБ, что занимает больше времени, чем работа сельдерея требуется, чтобы называться.
- Все методы ORM (например order_by, фильтр) необходимо использовать cached_FIELD.
- Recalculate_FIELD использует .update (cached_FIELD = установить значение.
- Flag_FIELD_as_stale использует .update, а также
Требования
- Python .
- Джанго
Комментарии не найдены