【问题标题】:How to build django-mptt tree without rebuilding after each insert?如何在每次插入后构建 django-mptt 树而不重建?
【发布时间】:2011-11-05 00:35:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我不这么认为,至少就 MPTT 而言,您应该在每次插入后重建插入项目右侧的部分树索引。使用 MPTT 读取非常便宜,而更新非常昂贵。尽管您可以一次性更新它们的索引 +2,而不是循环遍历右侧的项目。

标签: django django-mptt mptt


【解决方案1】:

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

【讨论】:

  • 看起来不错,但我不再从事此工作,也无法尝试。
【解决方案2】:

也许这可以在Proxy models 的帮助下解决。在代理模型中,可以重写save 方法以调用models.Modelsave 方法而不是MPTT save 方法。像这样的:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2011-07-01
    • 2012-09-04
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多