Форум сайта python.su
Всем привет.
Для работы с иерархической структурой использую django mptt.
Возникла проблема при копировании элементов. Так как тут не работает bulk create, не знаем будущего идентификатора объекта, приходиться создавать элементы в цикле.
Чем больше данных, тем больше времени, ресурсов используется.
Знаю, что нет 100% правильного решения. Может есть какие либо варианты с помощью которых можно ускорить работу копирования.
сейчас это выглядит упрощенно вот так
def copy_node(node, parent):
new_node = TreeStructure(
parent=parent
name=node.name
)
new_node.save()
for child in node.children.all():
self.copy_node(child, new_node)
return new_node
with transaction.atomic():
with TreeStructure.tree.delay_mptt_updates():
new_node = self.copy_node(node, parent)
Офлайн
С большими объемами данных с mptt не работал, но он сохраняет структуру древовидную в обычной таблице со вспомогательными колонками lft, rght – которые и характеризуют положение элемента в иерархии. До конца, однако, задача мне не ясна, но если бы lft и rght можно вычислить заранее в вашей задаче, то можно использовать и bulk_create, чтобы сразу создать много записей в таблице…
Офлайн
как вариант, во время такого копирования не использовать или отключить модель mptt, а потом перестроить ключи через rebuild() https://django-mptt.github.io/django-mptt/models.html#rebuild
Офлайн
Офлайн