Как создать дерево json из django-mptt?
Я хочу использовать JavaScript InfoVis Tooljit ( http://thejit.org) для отображения дерева узлов mptt в django. Как создать требуемую структуру json (см. http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html для примера) в django?
спасибо
4 ответов
если вы используете функциональность шаблона django-mptt для генерации данных JSON, вы должны иметь возможность сделать что-то вроде следующего:
var json =
{% recursetree nodes %}
{
id: "{{ node.id }}",
name: "{{ node.name }}",
data: {},
children: [{{ children }}]
},
{% endrecursetree %}
тег children является блестящим, в основном вызывая recursetree для каждого дочернего узла. Однако есть немного беспорядка, генерируемого вокруг запятых с этим решением, поскольку пример mptt вокруг элементов списка, где такие вещи не являются проблемой.
немного больший кусок кода решает это:
var json =
{
id: "{{ root.id }}",
name: "{{ root.name }}",
data: {},
children: [{% recursetree root.children %}
{
id: "{{ node.id }}",
name: "{{ node.name }}",
data: {},
children: [{{ children }}]
}
{% endrecursetree %}]
}
проводя различие между корневым узлом (предполагая, что есть только один), который не находится в массиве, но вместо этого назначается переменной, по сравнению с другими узлами, которые живут в дочерних узлах другого узла, вопрос.
есть еще проблема с children: [x,y,z,]
использование запятой. Если эта конечная запятая вызывает ошибки, то в представлении, вызвавшем шаблон, вы всегда можете сделать быструю замену строки на заменить ,]
С ]
в качестве альтернативы вы можете изменить {{ children }}
вызов mptt каким-то образом взять строку соединения, но это потребует гораздо больше работы.
создать JSON без проблемы с запятой:
{% full_tree_for_model YOUR_APP.YOUR_MODEL as nodes %}
var json = {% for genre,structure in nodes|tree_info %}{% if structure.new_level %} [{ {% else %} },{ {% endif %}
id: "{{ genre.id }}",
children: {% if genre.is_leaf_node %}[]{% endif %}
{% for level in structure.closed_levels %}}]{% endfor %}{% endfor %}
Если вы хотите написать свой собственный сериализатор или сделать это с видом, вы можете сделать:
from mptt.templatetags.mptt_tags import cache_tree_children
queryset = Foo.objects.all().select_related('bar')
queryset = cache_tree_children(queryset)
теперь queryset "кэшируется", что означает, что вы можете использовать методы API модели, такие как get_children()
без повторного попадания в базу данных.
Я нашел отличное решение для рендеринга детей с под-данными в этом потоке:самый быстрый способ создать JSON для отражения древовидной структуры в Python / Django с помощью mptt (см. принятый ответ craigds). Его метод также кэширует результаты и использует встроенный json.дампы для создания структуры.