можно ли «измерить» уровень вложенности экземпляра модели django - PullRequest
3 голосов
/ 20 апреля 2020

У меня есть модель Comment с полем Parent, которое само по себе ForeignKey, поэтому пользователи могут комментировать комментарии и т. Д. c.

Возможно ли это указать? 1011 * элемент, чтобы получить уровень вложенности: каково количество родителей до последнего, у которого нет родителя (но поле post не пустое)?

Я имею в виду, что относительно легко делать только с рекурсивной функцией, но мне интересно, есть ли более эффективный инструмент, использующий, возможно, Django запросы?

1 Ответ

1 голос
/ 20 апреля 2020

На самом деле это скорее проблема реляционной модели, чем проблема Джанга. Шаблон списка смежности (FK к родительской записи) - это самый простой и очевидный способ представления самореференциальной древовидной структуры в SQL, и он довольно быстр для операций записи, но ограничение состоит в том, что вы не можете получить информацию о глубине или подмножества деревьев без рекурсии (которые изначально не поддерживаются в SQL).

Существует два других шаблона SQL для деревьев:

1 / материализованный путь, в котором хранится строковое представление пути к элементу в дереве (а затем вам нужно проанализировать этот путь, чтобы получить информацию о родителях, дочерних элементах или глубине)

2 / вложенные множества - также известные как модифицированный обход дерева предзаказа (MPTT) - что довольно сложный, поэтому я даже не буду пытаться объяснить это здесь (но о topi c) довольно много, и он достаточно эффективен для получения подмножеств дерева на глубинах aribtrary и информации о глубине в одном запросе (это, конечно, гораздо менее эффективен при добавлении новых узлов в дерево, но если у вас больше записи, чем операции чтения и необходимость реорганизации целого огромного дерева каждую секунду, это практически не проблема).

Хорошая новость заключается в том, что существуют существующие, поддерживаемые, хорошо работающие приложения третьей части django, реализующие этот последний шаблон, наиболее часто используемый django -импт.

Полезную вводную статью об этих шаблонах (в контексте django проекта) можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...