Known Caveats

Updating objects

The nature of tree data means that many operations (e.g., adding a child to a tree node) affect related objects (e.g., the parent node).

For add/move operations, Treebeard will refresh the node being moved/created and its target. If you have other potentially affected nodes (e.g., siblings) in memory and plan to use them after a tree modification, you may need to reload them with object_instance.refresh_from_db().

Inconsistent state

The nature of tree implementations means that updating one object in a tree frequently requires making updates to several other objects (e.g., parents, siblings, children) in order to ensure efficiency of querying.

Treebeard wraps all create/update operations in a database transaction to minimise the impact of race conditions, but it is still possible for data to end up in an inconsistent state in cases where large numbers of concurrent writes take place. Projects may wish to consider overriding Treebeard methods to apply additional locks (e.g., lock the whole table when performing a move) to further reduce the chance of inconsistencies. This comes with a potentially significant performance penalty.

MP_Node ships with a fix_tree() method that can be used to find and correct inconsistencies in Materialized Path trees.

Overriding the default manager

One of the most common source of bug reports in django-treebeard is the overriding of the default managers in the subclasses.

django-treebeard relies on the default manager for correctness and internal maintenance. If you override the default manager, by overriding the objects member in your subclass, you WILL have errors and inconsistencies in your tree.

To avoid this problem, if you need to override the default manager, you MUST subclass the manager from the base manager class for the tree you are using.

Read the documentation in each tree type for details.

Custom Managers

Related to the previous caveat, if you need to create custom managers, you MUST subclass the manager from the base manager class for the tree you are using.

Read the documentation in each tree type for details.