Как построить дерево django-mptt без пересборки после каждой вставки? - PullRequest
4 голосов
/ 27 августа 2011

Я строю большое дерево MPT.Я хотел бы вставить все узлы и после этого метода запуска перестроить целое дерево:

for i in range(big_loop):
    ...
    m.save() # Saving mptt object. Tree is rebuild.
some_mptt_model.tree.rebuild()

Как мне избежать перестройки дерева после каждой вставки?

Я нашел только ключевое слово deractedв .save метод:

В более ранних версиях MPTTModel.save () имел необработанный аргумент ключевого слова.Если True, поля MPTT не будут обновляться во время сохранения.Этот (недокументированный) аргумент теперь удален.

Ответы [ 2 ]

3 голосов
/ 30 августа 2014

Вы можете отключить восстановление дерева после каждой вставки, используя disable_mptt_updates метод:

with MyModel.objects.disable_mptt_updates():
    # some bulk updates...
    for obj in objects:
        obj.save()

# And then you can rebuild the tree.
MyModel.objects.rebuild()
0 голосов
/ 18 апреля 2012

Возможно, это можно решить с помощью моделей прокси . В прокси-модели метод save может быть переопределен для вызова save метода models.Model вместо метода MPTT save. Примерно так:

class MyNonMPTTModel(MyMPTTModel):
    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        super(models.Model, self).save(*args, **kwargs)

Я не пробовал этот код, но думаю, он может работать.

...