2011-08-27 53 views
4

我正在建造大型mptt树。 我想插入所有节点和启动方法后重建整个树:如何在每次插入后重建django-mptt树?

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

我怎样才能避免重建后树上的每个插入?

我发现在.save方法只depracted关键字:

在早期版本中,MPTTModel.save()有一个原始关键字参数。如果 为真,则MPTT字段在保存期间不会更新。此 (无证)参数现在已被删除。

+0

我不这么认为,至少就MPTT推移,你应该对插入右侧重建树索引的一部分每个插入后的项目。随着MPTT读取非常便宜,而更新非常昂贵。虽然不是循环右手的物品,但你可以一次更新他们的索引+2。 –

回答

0

也许这可以通过Proxy models的帮助来解决。在代理模式中,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) 

我没有尝试此代码,但我想它可以工作。

3

您可以禁用使用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

看起来不错,但我不再工作,我不能尝试。 – Spodym