Использование родительских / дочерних отношений
Хотя верно, что вы можете использовать две модели с родительскими / дочерними отношениями для представления вашей иерархии форума, так как модели хранятсяв реляционной базе данных SQL вы должны сначала подумать, как вы собираетесь использовать эти модели, чтобы вы могли, в свою очередь, правильно их моделировать.
Если вам нужно всего лишь поиск в ширину (BFS) , то есть выберите только ближайшие родители или дети одного форума, код, подобный вамнаписал, и Django ORM будет великолепен.
Вы даже можете получить прародителя ребенка, но для этого потребуется много операций SQL SELECT
и JOIN
, как только ORM попадет в базу данных, что потенциально можетбыть довольно медленным
Использование одной модели
Так что, хотя ваша модель в порядке, она не очень подходит для ваших требований или, более конкретно, выбрав nodes
далеко вверх / вниз по иерархии, начиная со случайного узла (бабушка и дедушка ребенка).
То, что вы хотите сделать, - это построить простую N-арную структуру данных дерева, или, другими словами, иерархию и пройти по ней .Для этого вам не нужны две модели, достаточно только одной модели, имеющей отношение к себе (например, я назвал ее Node
).Чтобы получить N-го родителя в этой модели, вы просто должны зацикливаться n раз каждый раз после ваших отношений (это в основном связанный список )
n = 2 # Grandparent
node = Model.objects.get(pk=1)
while n:
if node.parent:
node = node.parent
# At the end of the loop `node` points to the grandparent
Моделирование древовидной структуры в SQLбаза данных
Потенциально существует множество способов реализовать деревья в базе данных SQL, но в вашем случае я бы предложил использовать MPTT , вместо, скажем, списка смежностей модель для построенияЭто.Оба являются методами для легкого манипулирования и хранения таких структур. MPTT потребуется больше записей в базу данных, чтобы добавить / переместить узлы вокруг дерева, но выбрать частичное дерево со случайным корнем (дочерним) очень просто, так как вам нужно фильтровать только по двум целочисленным полям.
С списками смежности вы можете потенциально обновить дерево с меньшим количеством записей, но вам нужно будет сделать гораздо больше операций для выбора частичного дерева, начиная со случайного корня.
Что касаетсяреализация MPTT в качестве приложения Django try django-mptt .
Разное: хорошая статья база данных иерархических данных дизайн.