如何构建 django-mptt 树而不在每次插入后重建?

发布于 2024-12-01 23:06:31 字数 379 浏览 2 评论 0原文

我正在构建大型 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 字段在保存期间不会更新。这 (未记录的)参数现已被删除。

I'm building large mptt tree.
I'd like to insert all nodes and after that start method for rebuilding whole tree:

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

How can I avoid rebuilding tree after each insert?

I've found only depracted keyword in .save method:

In earlier versions, MPTTModel.save() had a raw keyword argument. If
True, the MPTT fields would not be updated during the save. This
(undocumented) argument has now been removed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

街角卖回忆 2024-12-08 23:06:31

您可以使用 在每次插入后禁用重建树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()

You can disable rebuilding tree after each insert using disable_mptt_updates method:

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()
心奴独伤 2024-12-08 23:06:31

也许可以借助 代理模型。在代理模型中,可以重写 save 方法来调用 models.Modelsave 方法,而不是 MPTT save 方法。像这样的事情:

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

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

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

Maybe this can be solved with a help of Proxy models. In proxy model, save method could be overriden to call savemethod of models.Model instead of MPTT save method. Something like this:

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

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

I did not try this code, but I guess it could work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文