2

我已经成功完成了 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

在我发现的docoinsert_node中,但对它的理解不足以使其正常工作。我还在代码注释(第 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”,那么您能提供一个使用示例吗?

4

1 回答 1

3

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

但是,如果要在树中的特定点插入节点,则必须使用 TreeManager.insert_nodeor MPTTModel.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)
于 2013-05-20T10:31:25.283 回答