Синхронизация иерархий ¶
Введение ¶
Синхронизация иерархий (sync) — это процесс, который приводит структуру уровней и элементов иерархии в согласованное состояние, обновляет дерево (MPTT), связи между уровнями и таблицы классификаторов. Этот механизм обеспечивает корректную работу всех функций, зависящих от иерархических связей.
Что делает синхронизация? ¶
- Перестраивает дерево уровней (
MPTT), используя полеchildкак родительскую связь. - Обновляет связи между уровнями: parents, ancestors, descendants.
- Синхронизирует вспомогательные таблицы (dim-таблицы для классификаторов).
- Обеспечивает согласованность связей между элементами (items) на разных уровнях.
- Очищает устаревшие таблицы и индексы, создаёт новые при необходимости.
Основные этапы sync ¶
-
Перестроение дерева (MPTT):
-
Используется метод
Level.objects.rebuild(), который пересчитывает поляlft,rght,tree_id,levelдля всех уровней. -
Дерево строится по полю
child(в отличие от классического parent). -
Обновление связей между уровнями:
-
Для каждого уровня вызывается
level.sync(). -
Внутри происходит:
- Обновление M2M-связей
parentsна основе структуры дерева (child → parent). - Обновление M2M-связей
ancestors(все предки уровня). - Вызов вспомогательных методов:
get_parents_with_self,get_all_parents_with_self,update_relations.
- Обновление M2M-связей
-
Синхронизация структуры и контента:
-
Создаются/обновляются dim-таблицы для каждого уровня (таблицы классификаторов).
- Удаляются устаревшие dim-таблицы.
- Для каждого уровня вызывается
level.sync(with_children=False, sync_structure=True, sync_content=True). -
Обновляются связи между элементами (items) на разных уровнях (таблицы
core_hierarchy_item_parents,core_hierarchy_item_all_parents). -
Рекурсивная обработка дочерних уровней:
-
Для каждого дочернего уровня (child) рекурсивно вызывается sync.
Ключевые структуры данных и код ¶
- Модель
Level— основной класс, описывающий уровень иерархии. Дерево строится по полюchild(см.class MPTTMeta: parent_attr = "child"). - Метод
Level.sync()— основной вход для синхронизации одного уровня. Делегирует работу функцииsyncизplaniqum.core.hierarchy.libs.sync. -
Функция
sync(level, ...)— реализует логику синхронизации: -
Обновляет связи parents на основе MPTT-структуры.
- Синхронизирует структуру (dim-таблицы, индексы).
- Синхронизирует контент (items, связи между ними).
-
Рекурсивно вызывает sync для дочерних уровней.
-
Вспомогательные методы:
-
get_parents_with_self,get_all_parents_with_self,update_relations— используются для вычисления и обновления связей между уровнями. -
get_descendants,get_ancestors— работают по MPTT-структуре. -
Dim-таблицы — отдельные таблицы для хранения классификаторов на каждом уровне. Их структура и наполнение синхронизируются при каждом запуске sync.
-
Связи между элементами — таблицы
core_hierarchy_item_parentsиcore_hierarchy_item_all_parentsобновляются для отражения актуальных связей между элементами разных уровней.
Когда требуется запускать sync? ¶
- После загрузки или изменения структуры уровней (например, после импорта из yaml/csv/xlsx).
- После массового обновления или удаления уровней.
- После программных изменений дерева (например, через API или админку).
Пример вызова sync ¶
from planiqum.core.hierarchy.models import Level
# Перестроить всё дерево и синхронизировать все уровни
def full_sync():
Level.objects.sync()