2011-08-27 50 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