如何在`django-mptt`中优化添加新节点?

ide*_*ist 5 python database django performance django-mptt

我正在创建一个将同步两个数据库的脚本.数据库中有一个数据应该存储为树,所以我使用django-mptt作为新数据库.当我同步DB时,我从旧数据库中选择新数据,并将其保存在新数据库中.

我想知道是否有更好的方法将新节点添加到树中?现在看起来是下一个方式:

...
# Add new data to DB
for new_record in new_records:
    # Find appropriate parent using data in 'new_record'
    parent = get_parent(new_record)

    # Create object which should be added using data in 'new_record'
    new_node = MyMPTTModel(...)
    new_node.insert_at(parent, save = True)
    # Similar to:
    # new_node.insert_at(parent, save = False)
    # new_node.save()
Run Code Online (Sandbox Code Playgroud)

但它工作得很慢.我认为它以这种方式工作,因为每次调用该insert_at(..., save = True)方法后都django-mptt应该将新节点写入数据库并修改已经存在于数据库中的记录leftright键.

有没有办法在django-mptt每次调用时修改查询insert_at,然后在我打电话时将所有更改应用到一起save?或者你知道如何减少执行时间吗?

提前致谢.

cra*_*gds 13

首先,不要使用insert_at.这不是性能缓慢的原因,但这是不必要的,看起来很难看.刚设置node.parent:

for new_record in new_records:
    new_node = MyMPTTModel(..., parent=get_parent(new_record))
    new_node.save()
Run Code Online (Sandbox Code Playgroud)

现在为性能问题.如果您使用的是最新的mptt(git master,而不是0.5.4),那么delay_mptt_updates在您添加所有节点之前,会调用一个上下文管理器来阻止mptt进行大量的更新:

with transaction.atomic():
    with MyMPTTModel.objects.delay_mptt_updates():
        for new_record in new_records:
            new_node = MyMPTTModel(..., parent=get_parent(new_record))
            new_node.save()
Run Code Online (Sandbox Code Playgroud)

或者,如果你几乎触摸整个树,你可以通过最后使用disable_mptt_updates和重建整个树来加快速度:

with transaction.atomic():
    with MyMPTTModel.objects.disable_mptt_updates():
        for new_record in new_records:
            new_node = MyMPTTModel(..., parent=get_parent(new_record))
            new_node.save()
    MyMPTTModel.objects.rebuild()
Run Code Online (Sandbox Code Playgroud)