Построить все дерево из данных отношений списка смежности SQLAlchemy - PullRequest
0 голосов
/ 09 мая 2019

У меня есть класс Node с самореференциальным отображением backref 'parent', представляющим дерево в SQLAlchemy, и я хочу выбрать все дерево.

Модель класса

Class Node(db.Model):

   id = db.Column(db.Integer, primary_key= True)
   name = db.Column(db.String(100), nullable= False)

   parent_id = db.create_all(db.Integer, db.ForeignKey('id'))

   parent = db.relationship("Node",
                             primaryjoin='node.c.id == 
                             node.c.parent_id',
                             remote_side='Node.id',
                             backref=db.backref("node"))

База данных

Id |Имя |parent_id

1 |111 |Нет

2 |222 |Нет

3 |333 |2

4 |444 |2

5 |555 |2

6 |666 |5

7 |777 | Нет

Некоторые пытаются

from collections import defaultdict
from sqlalchemy.orm.attributes import set_committed_value

nodes = session.query(Node).all()

# Collect parent-child relations
children = defaultdict(list)
for node in nodes:
    if node.parent:
        children[node.parent.id].append(node)

# Set collected values
for node in nodes:
    set_committed_value(node, 'children', children[node.id])

Как использовать set_committed_value, получить результат

defaultdict(<type 'list'>, 
{ 
  <Node 1>: [],
  <Node 3>: [],
  <Node 4>: [], 
  <Node 6>: [],  
  <Node 5>: [<Node 6>],  
  <Node 2>: [<Node 3>, <Node 4>, <Node 5>], 
  <Node 7>: []
}
)

Я хочу, чтобы результат был

[
    {
        "id":1,
        "name":111
    },
    {
        "id":2,
        "name":222,
        "children":[
            {
                "id":3,
                "name":333
            },
            {
                "id":4,
                "name":444
            },
            {
                "id":5,
                "name":555,
                "children":[
                    {
                        "id":6,
                        "name":666
                    }
                ]
            }
        ]
    },
    {
        "id":7,
        "name":777
    }
]

было какое-нибудь решение?

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