Adjacency List trees

This is a simple implementation of the traditional Adjacency List Model for storing trees in relational databases.

In the adjacency list model, every node will have a “parent” key, that will be NULL for root nodes.

Since django-treebeard must return trees ordered in a predictable way, the ordering for models without the node_order_by attribute will have an extra attribute that will store the relative position of a node between it’s siblings: sib_order.

The adjacency list model has the advantage of fast writes at the cost of slow reads. If you read more than you write, use MP_Node instead.

Warning

As with all tree implementations, please be aware of the Known Caveats.

Inheritance diagram of AL_Node
class treebeard.al_tree.AL_Node(*args, **kwargs)

Bases: Node

Abstract model to create your own Adjacency List Trees.

Warning

If you need to define your own Manager class, you’ll need to subclass AL_NodeManager.

node_order_by

Attribute: a list of model fields that will be used for node ordering. When enabled, all tree operations will assume this ordering.

Example:

node_order_by = ['field1', 'field2', 'field3']
parent

ForeignKey to itself. This attribute MUST be defined in the subclass (sadly, this isn’t inherited correctly from the ABC in Django 1.0). Just copy&paste these lines to your model:

parent = models.ForeignKey('self',
                           related_name='children_set',
                           null=True,
                           db_index=True)
sib_order

PositiveIntegerField used to store the relative position of a node between it’s siblings. This attribute is mandatory ONLY if you don’t set a node_order_by field. You can define it copy&pasting this line in your model:

sib_order = models.PositiveIntegerField()

Examples:

class AL_TestNode(AL_Node):
    parent = models.ForeignKey('self',
                               related_name='children_set',
                               null=True,
                               db_index=True)
    sib_order = models.PositiveIntegerField()
    desc = models.CharField(max_length=255)

class AL_TestNodeSorted(AL_Node):
    parent = models.ForeignKey('self',
                               related_name='children_set',
                               null=True,
                               db_index=True)
    node_order_by = ['val1', 'val2', 'desc']
    val1 = models.IntegerField()
    val2 = models.IntegerField()
    desc = models.CharField(max_length=255)

Read the API reference of treebeard.models.Node for info on methods available in this class, or read the following section for methods with particular arguments or exceptions.

get_depth(update=False)
Returns:

the depth (level) of the node Caches the result in the object itself to help in loops.

Parameters:

update – Updates the cached value.

See: treebeard.models.Node.get_depth()

class treebeard.al_tree.AL_NodeManager(*args, **kwargs)

Bases: Manager

Custom manager for nodes in an Adjacency List tree.