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

#django #django-models #django-mptt

#django #django-модели #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, но движение вверх может измениться, т. е. у 1.2 могут быть родители 1 и / или 3.

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

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

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

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

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

—-ПРАВКА 2—-

django-treebeard-dag

django-dag

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

Комментарии:

1. Вы добились чего-нибудь с любым из этих двух проектов?

2. Я использовал django-dag . В основном я использую это как основу для своей структуры, а затем добавил свои собственные модели, чтобы добавить дополнительные детали для каждой сборки. Я только что здесь добавил свои базовые модели в djangosnippets, если вам нужен пример для начала

3. Почему вы переключились с django-treebeard-dag на django-dag? В настоящее время я оцениваю оба пакета.

4. Я думаю, что с treebeard-dag у меня возникли проблемы с запуском через фабрики. Я не знаю, было ли это из-за того, как были отформатированы мои данные, или из-за недостаточно надежного кода. Я был в целом разочарован темой, и все еще был начинающим программистом, поэтому я выбрал то, что смог заставить работать проще всего.

5. Сталкиваюсь с точно такой же проблемой с деталями / сборками и задаюсь вопросом, удалось ли вам с django-dag?

Ответ №1:

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

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

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

Комментарии:

1. Итак, кто собирается написать пакет Graph? 😉

2. Ну, я обнаружил, что мне нужен DAG для решения этой проблемы. Я нашел пару небольших проектов, но ничего слишком хорошо поддерживаемого или документированного. Спасибо за подсказку, Эван.

3. Не будучи специфичным для Django, взгляните на networkx как на библиотеку graph.