2013-07-09 4 views
0

То, что я пытаюсь сделать, можно сделать с помощью указателей в C++. Идея в том, что у меня есть объект, и он называется Node. Этот узел будет иметь пару характеристик:Создание портативных узлов в Django и использование их для создания деревьев

  1. Он подключен к другим узлам через родителей и детей.
  2. Его можно пересадить, его можно портировать, что означает, что я могу взять этот узел и вставлять его куда угодно, это может быть другое дерево, или я могу использовать этот узел, чтобы начать новое дерево.

Кроме того, это означает, что вы можете создать целые деревья, используя узлы. В идеале дерево будет представлять собой набор узлов, которые имеют один центральный величайший родитель.

Однако Узел может иметь двух или даже больше родителей.

+1

Без сторонних библиотек это займет некоторое время ... В любом случае, просмотр этих библиотек будет полезен: [django-mptt] (https://github.com/django-mptt/django-mptt), [django-treebeard] (https://github.com/tabo/django-treebeard) – stalk

ответ

2

Это легко выполнимо, но я бы не рекомендовал его с точки зрения производительности:

class YourModel(models.Model): 
    parent = models.ForeignKey('YourModel', related_name='children') 

    def siblings(self): 
     return self.objects.filter(parent=self.parent_id).exclude(pk=self.pk) 

Использование:

some_child = YourModel.objects.get(...) 
siblings = some_child.siblings() 
parent = some_child.parent() 
children = parent.children.all() 

Вопрос действительно, то, что вы хотите сделать?

+0

Я предпочитаю использовать этот синтаксис, на мой взгляд, это более понятно: 'parent = models.ForeignKey ('self', ...)' – stalk

+0

@stalk: откуда бы взялся «сам», это не входит в сферу действия, как есть? – Wolph

+0

ах, забыл поставить 'self' в' '' '. Обновлено сейчас, вот документы: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey – stalk

0

Я предлагаю вам проверить сторонние django-categories, которые обеспечивают иерархическую систему управления таксономией. Вы можете создавать узлы и привязывать их к другим для создания деревьев (с relationship от родителей и детей)

Смежные вопросы