Я создаю базовую CMS в фляжке для сайта, ориентированного на iPhone, и у меня проблемы с чем-то. У меня очень маленькая база данных с 1 таблицей (страницами). Здесь модель:
class Page(db.Model):
__tablename__ = 'pages'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
parent_id = db.Column(db.Integer, db.ForeignKey("pages.id"), nullable=True)
Как вы можете видеть, для вспомогательных страниц они просто ссылаются на другой объект страницы в поле parent_id
. То, что я пытаюсь сделать в панели администратора, имеет вложенный неупорядоченный список со всеми страницами, вложенными в их родительские страницы. У меня очень мало идей о том, как это сделать. Все, о чем я могу думать, это следующее (что будет работать (может быть, я его не тестировал) 2 уровня вниз):
pages = Page.query.filter_by(parent_id=None)
for page in pages:
if Page.query.filter_by(parent_id=page.id):
page.sub_pages = Page.query.filter_by(parent_id=page.id)
Я бы просто отформатировал его в списке в шаблоне. Как я могу выполнить эту работу с потенциально более чем 10 вложенными страницами?
Спасибо за кучи заранее!
EDIT: Я немного оглянулся и нашел http://www.sqlalchemy.org/docs/orm/relationships.html#adjacency-list-relationships, поэтому я добавил
children = db.relationship("Page", backref=db.backref("parent", remote_side=id))
в нижней части моей модели Page
. и я смотрю на рекурсивно просматривая все и добавляя его к дереву объектов. Я, вероятно, не имел никакого смысла, но что лучший способ я могу описать его
EDIT 2: Я решил сделать рекурсивную функцию для запуска всех страниц и создать большой вложенный словарь со всеми страницами и их дочерними элементами, но он продолжает сбой python, поэтому я думаю это просто бесконечный цикл... здесь функция
def get_tree(base_page, dest_dict):
dest_dict = { 'title': base_page.title, 'content': base_page.content }
children = base_page.children
if children:
dest_dict['children'] = {}
for child in children:
get_tree(base_page, dest_dict)
else:
return
и страницу, на которую я тестирую ее:
@app.route('/test/')
def test():
pages = Page.query.filter_by(parent_id=None)
pages_dict = {}
for page in pages:
get_tree(page, pages_dict)
return str(pages_dict)
У кого-нибудь есть идеи?