На самом деле это скорее проблема реляционной модели, чем проблема Джанга. Шаблон списка смежности (FK к родительской записи) - это самый простой и очевидный способ представления самореференциальной древовидной структуры в SQL, и он довольно быстр для операций записи, но ограничение состоит в том, что вы не можете получить информацию о глубине или подмножества деревьев без рекурсии (которые изначально не поддерживаются в SQL).
Существует два других шаблона SQL для деревьев:
1 / материализованный путь, в котором хранится строковое представление пути к элементу в дереве (а затем вам нужно проанализировать этот путь, чтобы получить информацию о родителях, дочерних элементах или глубине)
2 / вложенные множества - также известные как модифицированный обход дерева предзаказа (MPTT) - что довольно сложный, поэтому я даже не буду пытаться объяснить это здесь (но о topi c) довольно много, и он достаточно эффективен для получения подмножеств дерева на глубинах aribtrary и информации о глубине в одном запросе (это, конечно, гораздо менее эффективен при добавлении новых узлов в дерево, но если у вас больше записи, чем операции чтения и необходимость реорганизации целого огромного дерева каждую секунду, это практически не проблема).
Хорошая новость заключается в том, что существуют существующие, поддерживаемые, хорошо работающие приложения третьей части django, реализующие этот последний шаблон, наиболее часто используемый django -импт.
Полезную вводную статью об этих шаблонах (в контексте django проекта) можно найти здесь