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 (NULL = 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 з логічного типу, ймовірно, недобросовісний правда.
Уже це свого роду краще. 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 кешування поля /
Python 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 .
- Django
Коментар не знайдено