@kzlv

MPTT и неполное дерево — как его рендерить?

Привет!

Есть mptt и django.
Допустим, есть таски в виде дерева и теги у тасков. Так как просто добавлять теги нельзя (будет tree corruption при выборках), я решил сделать такую логику, чтобы теги родительских тасков были подмножеством тегов детей, но при этом чтобы дети могли иметь свои самостоятельные теги.

Таким образом это дерево будет валидным:

Задача 1; Тег 1
  Задача 2; Тег 1, Тег 2
  Задача 3; Тег 1, Тег 3
    Задача 4; Тег 1, Тег 3, Тег 4

Проблема в выборках по тегам. Несмотря на то, что при выборке по Тегу 3 в этом примере дерево не будет сломано (не будет пустот между уровнями вложенности), MPTT template tags не хотят рендерить такое дерево, они просто не отображают его на странице. Видимо, потому что отсутствует корневая нода.

Я полагаю, что решение проблемы лежит в переписывании их template tags, но я совершенно не знаю принцип работы nested sets и не в курсе, как работают template tags, и чтобы просто научить MPTT такому примитиву, придётся убить кучу времени. Может, вы знаете решение проще? :)

UPD.
Видимо, я непонятно выразился. Проблема есть конкретно на стадии шаблона. У меня имеется валидная выборка, которую template tag recursetree не хочет рендерить, потому что, как я полагаю, он не умеет рендерить не с корневой ноды. Вопрос конкретный: как это починить или можно ли навелосипедить малой кровью?
Одно решение уже всплыло: делать полную выборку (в том числе и с родителями, у которых этого тега нет), но на стороне шаблона проверять наличие нужного тега. Нет тега — гуляй. Но это велосипед, конечно.
  • Вопрос задан
  • 2921 просмотр
Пригласить эксперта
Ответы на вопрос 1
vvpoloskin
@vvpoloskin
Инженер связи
Я полагаю, что использование mptt (как и nested sets вообще) для таких задач избыточно. Оно вообще нужно преимущественно лишь там, где идет активная перестановка нод. То, что его лепят куда ни попадя, не говорит о правильности такого решения использования.
На вашем месте я бы просто сделал связал задачи через обычный FK на себя и делал через обычные свзязи. При этом ограничил бы количество вложенностей (10 штук?). Это будет проще.

Если все же вы хотите использовать mptt, помнится, в нем было хорошее api, можно спокойно найти задачу по тегам, затем через метод типа getParrent (не помню, как точно называется), дойти до родителя и отобразить его.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы