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.
Abstract model to create your own Adjacency List Trees.
Attribute: a list of model fields that will be used for node ordering. When enabled, all tree operations will assume this ordering.
node_order_by = ['field1', 'field2', 'field3']
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)
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()
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.Node for info on methods available in this class, or read the following section for methods with particular arguments or exceptions.
|Returns:||the depth (level) of the node Caches the result in the object itself to help in loops.|
|Parameter:||update – Updates the cached value.|