Я строю древовидную структуру на основе списка, полученного из списка db.Model
под названием Страницы.Обход дерева со страничным свойством sortIndex
Каждая запись на странице имеет свойство parentKey, которое является db.SelfReferenceProperty()
и db.IntegerProperty()
, называемое sortIndex.
Получаю список и вызываю метод для перемещения по списку и создаю nedled dict как мое дерево. Причина, по которой я извлекаю весь список, - это то, что я хочу пропустить несколько запросов.
pages = Pages.gql('ORDER BY sortIndex').fetch(1000)
build_tree(pages)
И build_tree:
def build_tree(nodes, *args):
# create empty tree to fill
tree = {}
build_tree_recursive(tree, None, nodes, *args)
return tree
def build_tree_recursive(tree, parent, nodes, *args):
# find root children, first level nodes have no parentKey
if parent is None:
children = [n for n in nodes if n.parentKey == None]
# find children
else:
children = [n for n in nodes if n.parentKey is not None and n.parentKey.key() == parent]
# build a subtree for each child
for child in children:
# start new subtree
key = child.key()
# Use page entry key as unique dict key
tree[key] = { 'page' : child, 'children' : {}}
# call recursively to build a subtree for current node
build_tree_recursive(tree[key]['children'], key, nodes)
Проблема заключается в том, что список прибудет-х переставить и не следует Det ORDER BY. Я думаю, это связано с тем, что каждая страница помещается в список, когда найден правильный родитель. Но даже первый уровень (страницы с parentKey == None
) возвращается в неправильном порядке.
Я попытался установить префикс с использованием счетчика циклов на дереве [str (i) + '_' + str (key)], но все равно не вернулся в правильном порядке.
Итак, вопрос, как получить их в надлежащем порядке?
EDIT [Решено]:
Ниже
Имейте в виду, что вы не экономить на запросах здесь - каждый раз, когда вы делаете «n.parentkey» в первый раз на сущности, она выбирает объект из хранилища данных. –
Спасибо. Я работал над этим последние пару часов и действительно заметил это. Любые идеи о том, как обойти это? Кажется, я где-то читал, что можно предварительно забрать некоторые данные? – fredrik
@fredrik: если бы вы отреагировали на свой вопрос вместо его редактирования (возможно, даже отметив его как принятый), другие не будут снова и снова находить ваш вопрос при поиске старых, неотвеченных вопросов. – Anthon