我正在为一个面向iPhone的站点构建一个基本的CMS-in-flask,我遇到了一些问题。我有一个非常小的数据库,只有一个表(页)。模型如下:
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)
有人有什么想法吗?
看http://sqlamp.angri.ru/index.html
或http://www.sqlalchemy.org/trac/browser/examples/adjacency_list/adjacency_list.py
UPD:用于邻接列表.py声明性示例
修正递归
使用示例中的查询从数据库中递归获取数据:
相关问题 更多 >
编程相关推荐