djang-mptt: tree 構造で export する
django-mptt: Tree モデルを エクスポート mptt_tags テンプレートライブラリ の recursetree / endrecursetree タグを使う profiles/templates/profile/workgroup/tree.json: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 {% load mptt_tags %} [ {% recursetree nodes %} { "id": "{{ node.id }}", "code": "{{ node.code|default:''}}", "name": "{{ node.name }}", "path": "{{ node.path }}", "full_name": "{{ node.full_name }}", "data": {}, "children": [{{ children }}] }{% if node.get_next_sibling %},{% endif %} {% endrecursetree %} ] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from django.template import engines, loader from django.utils.safestring import mark_safe from django.db.models import QuerySet def render(src, request=None, engine_name="django", safe=True, **ctx): text = engines[engine_name].from_string(src).render(ctx, request=request) return safe and mark_safe(text) or text def render_by(name, request=None, safe=True, **ctx): t = loader.get_template(name) text = t.render(ctx, request=request) return safe and mark_safe(text) or text def export_trees(nodes, model_class=None, template_name=None, request=None, safe=True, **ctx): if not model_class and isinstance(nodes, QuerySet): model_class = nodes.model if not template_name and model_class: template_name = f"{model_class._meta.app_label}/{model_class._meta.model_name}/tree.json" if not template_name: return "" return render_by(template_name, request=request, safe=safe, nodes=nodes, **ctx) 1 2 3 4 5 6 7 8 @main.command() @click.argument("path") @click.pass_context def workgroup_export(ctx, path): """ Workgroup Export """ nodes = models.Workgroup.objects.all() print(export_trees(nodes))