4

我正在构建大型 mptt 树。我想插入所有节点,然后是重建整个树的启动方法:

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

如何避免在每次插入后重建树?

我在.save方法中只发现了 depracticed 关键字:

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

4

2 回答 2

4

您可以使用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()
于 2014-08-30T12:41:20.243 回答
0

也许这可以在代理模型的帮助下解决。在代理模型中,save方法可以被重写为调用save方法models.Model而不是 MPTTsave方法。像这样的东西:

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

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

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

于 2012-04-18T14:19:04.403 回答