Кодирование двоичного дерева в json - PullRequest
0 голосов
/ 22 сентября 2011

Я использую 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}]}]}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

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

Я предполагаю, что вы просите сохранить данные в формате JSON?Или вы пытаетесь построить JSON из стандартных реляционных данных?

Если первое, почему бы вам просто не создать записи типа:

{id: XX, parentId: XX, left: XX, right: XX, value: "foo"}

для каждого из узлов, а затемвосстановить дерево вручную из записей?Просто начните с заголовка (parentId == null), а затем соберите ветви.

Вы также можете добавить дополнительный идентификатор для самого дерева, если у вас есть несколько деревьев в базе данных.Затем вы просто запросите, где treeId был XXX, и затем создадите дерево из записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...