Как эффективно показать множество вложенных дочерних элементов в наборе запросов, циклы for не работают

  • Я создал две модели, первая - Book, а вторая - SubBookPart (Sub Part of Book)
  • .
  • Пользователь сначала создает книгу
  • затем добавляет к этой книге ее подчасти, такие как "Глава 1", "Глава 2" и т.д.
  • затем добавьте "Страница 1", "Страница 2" и так далее к каждой главе
  • затем добавьте "Параграф 1", "Параграф 2" и так далее к каждому параграфу
  • .
  • Я успешно делаю это
  • Моя книга выглядит так
BookName
|- Chapter 1
   |- Page 1
      |- Paragraph 1
      |- Paragraph 2
      |- Paragraph 3
   |- Page 2
      |- Paragraph 1
      |- Paragraph 2
      |- Paragraph 3

|- Chapter 2
   |- Page 1
      |- Paragraph 1
      |- Paragraph 2
      |- Paragraph 3
   |- Page 2
      |- Paragraph 1
      |- Paragraph 2
      |- Paragraph 3
   |- Page 3
      |- Paragraph 1
      |- Paragraph 2
      |- Paragraph 3

Но я не знаю, как показать это во фронтенде, потому что это займет очень очень длинный вложенный цикл for, есть ли другой способ

.

models.py

class Book(models.Model):
    name = models.CharField(max_length=50)
    
    subparts = models.ManyToManyField("SubBookPart", related_name="book_subparts", blank=True)

class SubBookPart(models.Model):
    # for only first sub part
    subpart_of_book = models.ForeignKey(Book, on_delete=models.CASCADE,null=True, blank=True)

    # for only non-first sub parts, giving reference to previous subpart
    subpart_of = models.ForeignKey("SubBookPart", on_delete=models.CASCADE, null=True, blank=True)

    # subpart name like chapter, page, paragraph, line and so on
    subpart_name = models.CharField(max_length=50)

    # title like chaptername, para 2, page 4, line 5 etc
    title = models.CharField(max_length=50)
    
    # if this subpart contains more sub parts, this is used when book has many sub divisions
    subparts = models.ManyToManyField("SubBookPart", related_name="sub_subparts", blank=True)

bookview.html

{{book.name}}

<ul>
    {% for part in book.subparts.all %}
    <li>{{part}}</li>
    <ul>
        {% for firstpart in part.subparts.all %}
        <li>{{firstpart}}</li>
        <ul>
            {% for secondpart in firstpart.subparts.all %}
            <li>{{secondpart}}</li>
            <ul>
                {% for thirdpart in secondpart.subparts.all %}
                <li>{{thirdpart}}</li>
                {% endfor %}
            </ul>
            {% endfor %}
        </ul>
        {% endfor %}
    </ul>
    {% endfor %}
</ul>
Вернуться на верх