Как эффективно показать множество вложенных дочерних элементов в наборе запросов, циклы 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>