如何从django-mptt创建一个json树?

时间:2011-02-21 23:05:07

标签: django django-mptt

我想使用JavaScript InfoVis Tooljit(http://thejit.org)在django中渲染一个mptt节点树。如何在django中创建所需的json结构(请参阅http://thejit.org/static/v20/Jit/Examples/Spacetree/example1.code.html示例)?

由于

5 个答案:

答案 0 :(得分:6)

如果您使用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 %}]
}

通过区分根节点(假设只有一个)不存在于数组中而是分配给变量,与生活在另一个节点的子节点内的其他节点相比,{{1避免问题。

var x = y,使用逗号后面仍有问题。如果最后一个逗号引发错误,那么在调用模板的视图中,您始终可以执行快速字符串替换,将children: [x,y,z,]替换为,]

或者你可以用某种方式改变] mptt的调用以获取连接字符串,但这将涉及更多的工作。

答案 1 :(得分:2)

创建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 %}

答案 2 :(得分:1)

如果有人正在寻找基于带有 recursetree 标记的模板的解决方案,则可以使用 get_next_sibling 来控制逗号。改编克里斯提供的示例:

{% load mptt_tags %}
[
{% recursetree nodes %}
{
    "id": "{{ node.id }}",   
    "name": "{{ node.name }}",   
    "data": {},   
    "children": [{{ children }}]
}{% if node.get_next_sibling %},{% endif %}
{% endrecursetree %}
]

答案 3 :(得分:0)

如果您想编写自己的序列化程序或从视图执行此操作:

from mptt.templatetags.mptt_tags import cache_tree_children

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

现在查询集已“缓存”,这意味着您可以使用get_children()之类的模型API方法,而不会再次访问数据库。

答案 4 :(得分:0)

我找到了一个很好的解决方案,可以在这个帖子中使用子数据渲染孩子:fastest way to create JSON to reflect a tree structure in Python / Django using mptt(请参阅craigds接受的答案)。他的方法还缓存结果并使用内置的json.dumps来创建结构。