Импорт иерархий и создание связей в Planiqum¶
Основные сценарии импорта¶
-
Импорт иерархических данных осуществляется через команды Django:
Путь должен указывать на директорию внутри установленного приложения (например, data/hierarchy внутри test_basics).python manage.py importhierarchyitemsdir <путь_к_директории> -
Поддерживаются форматы CSV и XLSX. Для каждого уровня иерархии должен быть отдельный файл с именем
<level_key>.<csv|xlsx>. -
В процессе импорта:
- Элементы без родителей корректно импортируются и не создаются связи с NULL-значениями.
- Если родитель не найден, связь не создаётся и строка игнорируется.
- Все элементы (даже без родителей) попадают в таблицу core_hierarchy_item.
Логика создания связей¶
- Для каждого уровня иерархии связи между элементами строятся на основании колонок с ключами родительских уровней.
- Если для элемента не указан родитель или родитель не найден — связь не создаётся, IntegrityError не возникает.
- В таблицу core_hierarchy_item_parents попадают только валидные связи (оба элемента существуют).
Важные моменты¶
- Путь к директории импорта должен быть внутри установленного приложения (см. CUSTOM_INSTALLED_APPS).
- Если директория не найдена, будет выброшено исключение с соответствующим сообщением.
- Для тестовых данных рекомендуется использовать отдельное приложение (например, test_basics) и хранить данные в data/hierarchy.
Пример структуры данных для импорта¶
test_basics/
└── data/
└── hierarchy/
├── level1.csv
├── level2.csv
└── ...
Пример файла уровня (CSV)¶
| shortname | description | parent_level |
|---|---|---|
| item1 | ... | parent1 |
| item2 | ... |
- Если parent_level пустой или не найден — связь не создаётся, но элемент импортируется.
Отладка и журналирование¶
- Весь процесс импорта логируется (см. core_hierarchy/libs/import_hierarchy_items.py).
- В журнале импортов фиксируются:
- Количество добавленных, обновлённых элементов
- Количество добавленных, обновлённых, удалённых связей
- Ошибки и исключения
Типовые ошибки¶
- ValueError: Директория не найдена ни в одном из установленных приложений — проверьте путь и настройки INSTALLED_APPS/CUSTOM_INSTALLED_APPS.
- IntegrityError: null value in column "to_item_id" — устранено, теперь такие связи не создаются.
См. также¶
Используемые методы и их специфика¶
Основные функции и модули¶
- import_hierarchy_items_dir(path, root_='IMPORT_ROOT')
- Импортирует иерархические данные из директории.
- Автоматически определяет уровни и соответствующие им файлы.
- Использует настройки проекта для поиска директории (обычно внутри установленного приложения).
-
Логирует процесс, выбрасывает ValueError, если директория не найдена.
-
import_hierarchy_items(level=None, df=None, filename="", ...)
- Импортирует элементы иерархии для одного уровня.
- Может принимать DataFrame напрямую или путь к файлу.
- Автоматически группирует по shortname, чтобы избежать дублирования.
-
Вызов из import_hierarchy_items_dir происходит для каждого уровня.
-
_import_hierarchy_items_from_df(level, df)
- Основная функция, реализующая логику импорта из DataFrame.
- Создаёт/обновляет элементы, вызывает функции для создания связей.
- Ведёт журнал импортов (ImportResult).
-
Обрабатывает ошибки и исключения.
-
__import_hierarchy_items_body(level, df)
- Импортирует и обновляет элементы уровня (core_hierarchy_item).
- Обновляет description, is_active, is_new.
-
Создаёт временные таблицы для ускорения операций.
-
__import_hierarchy_items_rel(level, df)
- Создаёт связи между элементами (core_hierarchy_item_parents).
- Использует melt DataFrame для нормализации связей.
- Не создаёт связи, если родитель не найден (to_item_id is NULL).
- Все операции с временными таблицами и SQL-запросами логируются.
Специфика использования¶
- Все функции используют Pandas DataFrame для обработки данных, что позволяет легко интегрировать импорт из различных форматов (CSV, XLSX).
- Для ускорения операций массового импорта используются временные таблицы и bulk-операции через SQL.
- Вся логика построена так, чтобы не возникало IntegrityError при отсутствии родителей — такие связи просто игнорируются.
- Для отладки и аудита используется подробное логирование (см. core_hierarchy/libs/import_hierarchy_items.py).
- Импорт можно запускать как через manage.py, так и программно из других частей кода.
- Для тестирования рекомендуется использовать отдельные приложения с тестовыми данными и явно указывать их в CUSTOM_INSTALLED_APPS.
Пример программного использования¶
from planiqum.core.hierarchy.libs.import_hierarchy_items import import_hierarchy_items
import pandas as pd
df = pd.read_csv('data/hierarchy/level1.csv')
import_hierarchy_items(level='level1', df=df)