私はiPhone指向のサイト用にフラスコ内に基本的なCMSを構築していますが、何か問題があります。テーブル(ページ)が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を超える可能性のあるネストされたページでこれを機能させるにはどうすればよいですか?
事前にヒープに感謝します!
編集:少し調べてhttp://www.sqlalchemy.org/docs/orm/relationships.html#adjacency-list-relationshipsを見つけたので、追加しました
children = db.relationship("Page", backref=db.backref("parent", remote_side=id))
Page
私のモデルの一番下に。そして、私はすべてを再帰的に調べて、それをオブジェクトのツリーに追加することを検討しています。私はおそらく意味がありませんが、それは私がそれを説明することができる最良の方法です
編集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)
誰かアイデアがありますか?