Как создать дерево json из django-mptt? - PullRequest
9 голосов
/ 22 февраля 2011

Я хочу использовать JavaScript InfoVis Tooljit (http://thejit.org) для рендеринга дерева узлов mptt в django. Как я могу создать необходимую структуру JSON (см. http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html для примера) в Django?

Спасибо

Ответы [ 4 ]

6 голосов
/ 13 апреля 2011

Если вы используете шаблонную функциональность 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 %}]
}

Проводя различие между корневым узлом (при условии, что он существует только один), который не находится в массиве, а назначается переменной, по сравнению с другими узлами, которые живут в дочерних узлах другого узла, var x = y, проблема устранена.

По-прежнему существует проблема с children: [x,y,z,] с запятой. Если эта последняя запятая вызывает ошибки, то в представлении, вызвавшем шаблон, вы всегда можете быстро заменить строку, заменив ,] на ]

В качестве альтернативы вы могли бы каким-то образом изменить вызов mptt {{ children }}, чтобы получить строку соединения, но это потребовало бы гораздо больше работы.

2 голосов
/ 06 марта 2012

Создать 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 %}
0 голосов
/ 25 января 2015

Я нашел отличное решение для рендеринга дочерних элементов с под-данными в этой теме: самый быстрый способ создания JSON для отражения древовидной структуры в Python / Django с использованием mptt (см. Принятый ответ по craigds). Его метод также кэширует результаты и использует встроенный json.dumps для создания структуры.

0 голосов
/ 08 марта 2013

Если вы хотите написать свой собственный сериализатор или сделать это из представления, вы можете сделать:

from mptt.templatetags.mptt_tags import cache_tree_children

queryset = Foo.objects.all().select_related('bar')
queryset = cache_tree_children(queryset)

Теперь набор запросов «кэшируется», что означает, что вы можете использовать методы API модели, такие как get_children(), без повторного попадания в базу данных.

...