Как я понимаю, проблема у вас в том, что вы перехватываете сохранение, когда
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)