В Django-mptt и несколько родителей?

Я пытаюсь реализовать структуру базы данных, которая имеет иерархическую данных деталей для сборки. Моя основная проблема заключается в попытке назначить одну "сборку" другой "сборке"/дереву. Ссылаясь на приведенные ниже деревья примеров - у меня нет проблем с созданием и работой со сборкой 1 и 2. Но когда я делаю сборку 3, я получаю несколько объектов возвращенные ошибки при вызове узлов сборки (которые я понимаю на основе способа, которым я пытаюсь).

assembly 1:    assembly 2:     assembly 3:
1.1            2.1             2.1
- 1.1.1        - 2.1.1         - 2.1.1
1.2            2.2             1.2
- 1.2.1        - 2.2.1         - 1.2.1               

вот модель, которую я пробовал:

#models.py snippet
class Part(models.Model):
        part_name = models.CharField(max_length=30, primary_key=True)
        description = models.TextField(max_length=500, blank=True, null=True)
        revision = models.CharField(max_length=10, blank=True, null=True)

        def __unicode__(self):
                return u'%s' % (self.part_name)

class Assembly(MPTTModel):
        name = models.ForeignKey(Part)
        parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

        def __unicode__(self):
                return u'%s' % (self.name)

#views.py snippet
def assembly_details(request, assembly_name):
        context_instance=RequestContext(request)
        assembly = Assembly.objects.get(name=assembly_name)
        descendants_list = assembly.get_descendants(include_self=False)
        return render_to_response('assembly_details.html', locals(), context_instance,)

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

для чего я поступая из любой заданной точки дерева, движение вниз всегда будет одинаковым, т. е. 1.2 всегда будет иметь ребенка 1.2.1, но движение вверх может измениться, i.e 1.2 могут иметь родителей 1 и / или 3 детей.

проблема-сборка.parent - это ForeignKey, поскольку он ограничивает его одним значением. Есть идеи по некоторым решениям или вещам, чтобы попробовать?

пожалуйста, дайте мне знать, если вы хотите увидеть дополнительные код или задавать вопросы. Это, кажется, трудно объяснить! Спасибо

----редактировать----

Я понял, что мне нужна модель направленного a-циклического графа (DAG).

у меня еще нет конкретного решения, но когда я выясню это или задам вопрос DAG, я попытаюсь опубликовать ссылку здесь.


----редактировать 2----

Джанго-древень-Даг

Джанго-Даг

Я нашел эти два очень маленькие проекты. Первоначально я работал с версией "treebeard", затем переключился на django-dag для моего проекта. Не стесняйтесь PM с вопросами об основном использовании, и я посмотрю, могу ли я помочь.

1 ответов


Я думаю, что Django-mptt-неправильный инструмент для этой конкретной работы. Он имеет дело с деревьями, и частью дерева в структурах данных является то, что узлы имеют одного родителя, или узел является корнем дерева.

деревья являются обобщенной формой графы. Я не знаю приложения Django, которое поможет вам справиться с ними.

возможно, вам придется прибегнуть к поддержанию собственных отношений ManyToMany и отказаться от удобства Django-mptt.