【问题标题】:How can create a json tree from django-mptt?如何从 django-mptt 创建一个 json 树?
【发布时间】:2011-07-01 15:12:23
【问题描述】:

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

谢谢

【问题讨论】:

    标签: django django-mptt


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我在此线程中找到了使用子数据呈现子数据的绝佳解决方案:fastest way to create JSON to reflect a tree structure in Python / Django using mptt(请参阅 craigds 接受的答案)。他的方法还缓存结果并使用内置的 json.dumps 来创建结构。

      【讨论】:

        【解决方案3】:

        如果您想编写自己的序列化程序或从视图中执行此操作,您可以这样做:

        from mptt.templatetags.mptt_tags import cache_tree_children
        
        queryset = Foo.objects.all().select_related('bar')
        queryset = cache_tree_children(queryset)
        

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

        【讨论】:

          【解决方案4】:

          创建没有尾随逗号问题的 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 %}
          

          【讨论】:

          • 你能在MIT下发布这个sn-p吗?
          【解决方案5】:

          如果您使用 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 }} 调用以获取连接字符串,但这会涉及更多工作。

          【讨论】:

          • 我发现使用这种方法存在一些问题(在子节点之间添加逗号,并且所有子信息似乎都没有正确输入)。但是,它非常有用,可以让我指出正确的方向。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 2010-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-15
          • 2011-11-05
          相关资源
          最近更新 更多