我正在为一个面向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)
Run Code Online (Sandbox Code Playgroud)
如您所见,对于子页面,它们只是引用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)
Run Code Online (Sandbox Code Playgroud)
然后我会将其格式化为模板中的列表.如何使用可能超过10个嵌套页面来完成此工作?
谢谢你提前!
编辑:我看了一下,发现http://www.sqlalchemy.org/docs/orm/relationships.html#adjacency-list-relationships,所以我添加了
children = db.relationship("Page", backref=db.backref("parent", remote_side=id))
Run Code Online (Sandbox Code Playgroud)
在我的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, …Run Code Online (Sandbox Code Playgroud)