Simple way to create, persist and manipulate reliable tree structures using Django models.
pip install django-trees
To create a model extend AbstractNode and add desired fields.
from django.db import models
from django_trees.models import AbstractNode
class Folder(AbstractNode):
name = models.CharField(max_length=10)To create a tree node, there is nothing different than creating a normal Django model other than you may specify a parent node.
root = Folder.objects.create(name="Root")
documents = Folder.objects.create(name="Documents", parent=root)
downloads = Folder.objects.create(name="Downloads", parent=root)
projects = Folder.objects.create(name="Projects", parent=documents)To retrieve all of the descendants of a node (including children, grandchildren, great grandchildren, etc) use the get_descendants method. This method will return a flat list of node objects.
root.get_descendants()To retrieve all of the ancestors of a node (including parents, grandparents, great grandparents, etc) use the get_ancestors method. This method will return a flat list of node objects.
projects.get_ancestors()To retrieve all immediate children of the current node use the get_children method. This method will return a flat list of node objects.
projects.get_children()To move a node to a different position in the tree use the move method passing the new parent node as an argument.
projects.move(root)To create a separate tree from a branch of an existing tree use the bifurcate method. The node object will be removed from the previous tree and it along with its descendants will now be in a new tree.
projects.bifurcate()To get an ascii representation of the tree structure use the get_ascii_tree method.
projects.get_ascii_tree()