我已经成功完成了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',那么你可以提供一个使用它的例子吗?
答案 0 :(得分:1)
我承认,这可能有点令人困惑。但是,正如您可以阅读here一样,order_insertion_by
字段只应在您执行类似标准插入行为的操作时使用,例如按字母顺序排列的树等等,因为它会触发额外的数据库查询
但是,如果要在树中的特定点插入节点,则必须使用其中一个节点
TreeManager.insert_node
或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)