Как создать дерево 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.дампы для создания структуры.