How can create a json tree from django-mptt?

喜欢而已 提交于 2019-11-29 03:05:35

问题


I want to use the JavaScript InfoVis Tooljit ( http://thejit.org ) to render a tree of mptt nodes in django. How can i create the required json structure (see http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html for an example) in django?

Thanks


回答1:


If you use the template functionality of django-mptt to generate the JSON data you should be able to do something like the following:

var json =    
{% recursetree nodes %}
{
    id: "{{ node.id }}",   
    name: "{{ node.name }}",   
    data: {},   
    children: [{{ children }}]
},
{% endrecursetree %}

The children tag is brilliant, basically calling recursetree for each child of the node. However there is a little messiness generated around commas with this solution as the mptt example is around list elements where such things aren't a problem.

A slightly larger bit of code solves this:

var json =    
{
    id: "{{ root.id }}",   
    name: "{{ root.name }}",   
    data: {},   
    children: [{% recursetree root.children %}
    {
        id: "{{ node.id }}",   
        name: "{{ node.name }}",   
        data: {},   
        children: [{{ children }}]
    }
    {% endrecursetree %}]
}

By making a distinction between the root node (presuming there is only one) which does not reside within an array but is instead assigned to a variable, compared to other nodes which live within the children of another node, the var x = y, issue is avoided.

There is still a problem with children: [x,y,z,] having a trailing comma. If that final comma is raising errors then in the view that has called the template you can always do a quick string replace to replace ,] with ]

Alternatively you could alter the {{ children }} call of mptt in some way to take a join string, but that would involve much more work.




回答2:


Create JSON without trailing comma problem:

{% 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 %}



回答3:


If you want to write your own serializer or do this from a view you can do:

from mptt.templatetags.mptt_tags import cache_tree_children

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

Now the queryset is "cached", meaning you can use model API methods like get_children() without it hitting the database again.




回答4:


I found a great solution to rendering children with sub-data in this thread: fastest way to create JSON to reflect a tree structure in Python / Django using mptt (See the accepted answer by craigds). His method also caches results and uses the built in json.dumps to create the structure.



来源:https://stackoverflow.com/questions/5072301/how-can-create-a-json-tree-from-django-mptt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!