【问题标题】:Serializing a tree in Django在 Django 中序列化一棵树
【发布时间】:2011-08-01 14:43:21
【问题描述】:

有没有简单的方法来序列化模型给出的树,例如下面显示的类别?

我想要一个 json 对象,例如:

[ { 'name': 'cat1',
    'children': [ { 'name': 'cat11',
                    'children': [ ... ]
                ]
  }
  ...
]

谢谢

class Category(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    order_key = models.IntegerField()

    class Meta:
        verbose_name_plural = 'Categories'

    class MPTTMeta:
        order_insertion_by = ['order_key']

    def __unicode__(self):
        return "%s" %(self.name)

【问题讨论】:

    标签: django serialization tree


    【解决方案1】:

    也许 Tasypie 或 Django-Piston 可以提供帮助?如果没有,您可以查看他们的源代码以获取有关如何执行此操作的一些提示。

    【讨论】:

      【解决方案2】:

      我认为您必须遍历树,并构建一个使用 JSON 序列化的对象。我假设你的树是无环的,否则它会变得更加复杂。我还没有测试过这个,但是这样的东西会起作用(只要你确定你没有周期):

      def serialize_to_json(self):
          return json.dumps(self.serializable_object())
      
      def serializable_object(self):
          "Recurse into tree to build a serializable object"
          obj = {'name': self.name, 'children': []}
          for child in self.get_children():
              obj['children'].append(child.serializable_object())
          return obj
      

      (不记得children_set是否是获取孩子列表的正确方法。如果这是错误的,请评论。)

      【讨论】:

      • 谢谢。使用 dump 而不是 dumps 和 get_children() 而不是 children_set.all()。
      • 有什么理由不把那只小狗变成一个列表理解?
      • 可读性,那会是一长串难以阅读的代码?
      • 我看到你正在使用django-mptt。确保在评估查询集之前调用 cache_tree_children()。否则每次使用get_children()时它都会访问数据库。
      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多