fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

MPTT tree копирование ветвей?

Может кто сталкивался с проблемой:
Есть дерево PolymorphicMPTTModel. Появилась задача - если меняется родитель произвольной ветки, то копируем данные ветки на новое место, оставляя на старом месте копию ветки со старыми id с пометками объектов "deleted".
Я перехватываю сохранение объекта, смотрю - если parent у него меняется - то создаю ветку с топологией старой ветки, копируя данные с помощью генератора self.get_descendants(include_self=True). А parent оригинальной ветки меняю на новый.
Все хорошо - только теперь копия ветки deleted - с новыми id, - то есть ветка перенеслась на новое место, а на ее месте возникла ветка deleted с НОВЫМИ id.
Как наименьшей кровью у ветки deleted оставить СТАРЫЕ id, а у перемещенной - создать новые?
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
Как я понимаю, проблема у вас в том, что вы перехватываете сохранение, когда parent уже изменён. Я бы делал это примерно так.

class MyModel(models.Model):
    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self._initial_parent = self.parent

    def save(self, *args, **kwargs):
        new_parent = self.parent
        if new_parent != self._initial_parent:
            # Marking old branch as obsolete
            self.descendants().update(is_deleted=True)

            # Now, creating a new branch (with new IDs) at the destination node
            root = MyModel.objects.create(parent=new_parent, ...)
            [MyModel.objects.create(...) ...]

            # And cancelling the moving of the current element
            self.parent = self._initial_parent
            self.is_deleted = True

        return super(MyModel, self).save(*args, **kwargs)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы