Я не решаюсь дать этот ответ, потому что я не уверен, что я действительно понимаю вашу проблему, которую вы пытаетесь решить (двоичное дерево, 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])