Question

I have successfully completed the django-mptt tutorial. What I cannot figure out how to do is create a child of a child.

By child of a child, i mean a third level deep and more. See example below, I want to create 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

In the doco i found insert_node but dont understand it enough to get it working. Also i found something in the code comments (line 317) regarding insert_node that says:

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.

Should i be using 'insert_node' or is there a better way? If 'insert_node' should be used, then can you provide an example of its use?

Was it helpful?

Solution

This can be a little confusing, I admit. But as you can read here, the order_insertion_by field should only be used, when you're after something like a standard insertion behavior, for example alphabetically ordered trees and so on as it triggers an extra db query.

However, if you want to insert a node at a specific point in your tree, you have to use either TreeManager.insert_node or MPTTModel.insert_at, the latter being a convenience method for calling the first.

So, according to your example, this leads to the following three options to add a new 1.3.3 Product Q as last child of 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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top