Итерация по списку смежности Python Flask/Jinja2
Я пытаюсь распечатать список вложенных комментариев, используя рекурсивный цикл Jinja2 for. У меня проблема в том, что после распечатки полной вложенной ветви она начинается снова с одного из вложенных потомков и оттуда рисует другой список.
Я хотел бы найти способ пропустить итерацию, если она уже была напечатана ранее.
У меня определена следующая модель колбы:
class Comment(db.Model):
"""Class containing comments to a post"""
__tablename__ = "comment"
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(255))
parent_id = db.Column(db.Integer, db.ForeignKey('comment.id'))
children = db.relationship("Comment")
def __init__(self, body=None, parent_id=None):
self.body = body
self.parent_id = parent_id
Это загружает несколько вложенных комментариев:
comment = Comment(body="First Comment")
db.session.add(comment)
db.session.commit()
comment2 = Comment(body="Nested with First Comment", parent_id=comment.id)
db.session.add(comment2)
db.session.commit()
comment3 = Comment(body="Also nested with First Comment", parent_id=comment.id)
comment4 = Comment(body="Nested with the fist nested comment", parent_id=comment2.id)
db.session.add(comment3)
db.session.add(comment4)
db.session.commit()
Вот соответствующий шаблон Jinja2:
<div class="row">
<ul class="media-list">
<li class="media">
{%- for comment in user.musician.comments recursive %}
<div class="media">
<span class="pull-left">
{{ comment.author.name }} said:
</span>
<div class="media-body">
<p>{{comment.body }}</p>
{% if comment.children %}
<!-- Children starts here -->
{{ loop(comment.children) }}
<!-- end of child -->
{% endif %}
</div>
</div>
{% endfor %}
</li>
</ul>
</div>
1 ответ
Решение
Похоже, ваш первоначальный запрос выглядит примерно так
comments = Comment.query.all() # perhaps there's an order_by
Это возвращает набор запросов со всеми комментариями в нем, даже те, которые являются дочерними. То, что вы действительно хотите, это только те комментарии, которые не являются потомками других комментариев.
comments = Comment.query.filter(Comment.parent_id == None) # same order_by goes here