Джанго-мптт и множественные родители? - PullRequest
9 голосов
/ 26 апреля 2011

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

Я пытаюсь реализовать структуру базы данных, которая имеет иерархические данные деталей для сборок. Моя основная проблема заключается в попытке назначить одну «сборку» другой «сборке» / дереву. Обращаясь к деревьям примеров ниже - у меня нет проблем с созданием и работой со сборкой 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, но при подъеме может измениться, т. Е. У 1.2 могут быть родители 1 и / или 3.

Проблема в том, что Assembly.parent должен быть ForeignKey, поскольку он ограничивает его одним значением. Есть идеи по поводу некоторых решений или вещей, которые стоит попробовать?

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

---- EDIT ----

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

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


---- РЕДАКТИРОВАТЬ 2 ----

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

Джанго-даг

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

1 Ответ

12 голосов
/ 27 апреля 2011

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

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

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

...