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.
Bases: treebeard.models.Node
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.
Example:
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()
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.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. |
See: treebeard.Node.get_depth()