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)