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.
- 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 subclassAL_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 anode_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.
- class treebeard.al_tree.AL_NodeManager(*args, **kwargs)¶
Bases:
Manager
Custom manager for nodes in an Adjacency List tree.