我正在使用sqlalchemy在db:
中存储二叉树数据class Distributor(Base):
__tablename__ = "distributors"
id = Column(Integer, primary_key=True)
upline_id = Column(Integer, ForeignKey('distributors.id'))
left_id = Column(Integer, ForeignKey('distributors.id'))
right_id = Column(Integer, ForeignKey('distributors.id'))
如何生成如上所列的json“tree”格式数据:
{'id':1,children:[{'id':2, children:[{'id':3, 'id':4}]}]}
答案 0 :(得分:0)
我猜你要求以JSON格式存储数据?或者您是否尝试从标准关系数据构造JSON?
如果是前者,为什么不创建像:
这样的条目{id: XX, parentId: XX, left: XX, right: XX, value: "foo"}
对于每个节点,然后从条目手动重建树?从头开始(parentId == null)然后组装分支。
如果数据库中有多个树,您还可以为树本身添加其他标识符。然后你只需要查询treeId是XXX的位置,然后从条目中构造树。
答案 1 :(得分:0)
我毫不犹豫地提供这个答案,因为我不确定我是否真的理解你要解决的问题(二叉树,JSON,sqlalchemy,这些都不是问题)。
使用这种结构可以做的是迭代每一行,随着时间的推移添加边。你将从基本上是对象的缓存开始;最终将成为你需要的树。
import collections
idmap = collections.defaultdict(dict)
for distributor in session.query(Distributor):
dist_dict = idmap[distributor.id]
dist_dict['id'] = distributor.id
dist_dict.setdefault('children', [])
if distributor.left_id:
dist_dict.['children'].append(idmap[distributor.left_id])
if distributor.right_id:
dist_dict.['children'].append(idmap[distributor.right_id])
因此,我们收集了大量可以代表树的链接词。但是,我们不知道哪一个是根;
root_dist = session.query(Distributor).filter(Distributor.upline_id == None).one()
json_data = json.dumps(idmap[root_dist.id])