Итерация по списку смежности 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
Другие вопросы по тегам