Я создаю базовую CMS в колбе для сайта, ориентированного на iPhone, и у меня возникли небольшие проблемы с чем-то. У меня очень маленькая база данных с одной таблицей (страниц). Вот модель:
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)
у кого-нибудь есть идеи?