使用django-mptt创建子记录

时间:2013-05-18 05:40:14

标签: django-mptt

我已经成功完成了django-mptt教程。我无法弄清楚如何做一个孩子的孩子。

孩子的孩子,我的意思是深度和更高的第三级。见下面的例子,我想创建1.3.1,1.3.2,1.3.1.1

1.0 Product Z
      1.1 Product A
      1.2 Product B
      1.3 Product P
            1.3.1 Product X
                   1.3.1.1 Product O
            1.3.2 Product Y
2.0 Product H

doco我发现insert_node但是不明白它足以让它发挥作用。另外,我在code comments(第317行)中找到了关于insert_node的内容:

NOTE: This is a low-level method; it does NOT respect ``MPTTMeta.order_insertion_by``.
        In most cases you should just set the node's parent and let mptt call this during save.

我应该使用'insert_node'还是有更好的方法?如果应该使用'insert_node',那么你可以提供一个使用它的例子吗?

1 个答案:

答案 0 :(得分:1)

我承认,这可能有点令人困惑。但是,正如您可以阅读here一样,order_insertion_by字段只应在您执行类似标准插入行为的操作时使用,例如按字母顺序排列的树等等,因为它会触发额外的数据库查询

但是,如果要在树中的特定点插入节点,则必须使用其中一个节点 TreeManager.insert_nodeMPTTModel.insert_at,后者是调用第一个的便捷方法。

因此,根据您的示例,这会导致以下三个选项添加新的 1.3.3 Product Q 作为 1.3 Product P 的最后一个孩子:

new_node = ProductNode(name='1.3.3 Product Q')

parent = ProductNode.objects.get(name='1.3 Product P')


# With `order_insertion_by`

new_node.parent = parent
new_node.save()


# With `TreeManager.insert_node`

ProductNode.objects.insert_node(new_node, parent, position='last-child', save=True)


# With `MPTTModel.insert_at`

new_node.insert_at(parent, position='last-child', save=True)