Подсчет всех записей во вторичной таблице в отношениях ManyToMany с помощью Django
Как подсчитать общее количество читателей, связанных с каждой книгой в файле index.html? В index.html первый цикл перебирает читателей и выдает сумму для количества книг, связанных с каждым читателем. Второй цикл не считает количество книг, прочитанных читателем (я понимаю почему).
Я пытаюсь подсчитать общее количество читателей, связанных с каждой книгой. Есть ли способ выполнить эту задачу в файле index.html? Или это должно быть сделано в views.py? Или я должен был изначально настроить отношения между моделями иначе?
Я гуглил, но не могу найти ответ.
models.py
class Book(models.Model):
title = models.CharField(max_length=100)
class Reader(models.Model):
name = models.CharField(max_length=100)
book_read = models.ManyToManyField(Book)
views.py
def index(request):
all_readers = Reader.objects.all()
all_books = Book.objects.all()
context = {
"all_readers": all_readers,
"all_books": all_books,
}
return render(request, "testing/index.html", context)
index.html
{% for reader in all_readers %}
<h3>{{ reader.book.all.count }}</h3>
{% endfor %}
{% for book in all_books %}
<h3>{{ book.reader.all.count }}</h3>
{% endfor %}
Чтобы подсчитать общее количество читателей, связанных с каждой книгой в index.html, вы можете использовать функцию Count из Django ORM, чтобы получить количество читателей для каждой книги.
Вот пример того, как вы можете сделать это в своем шаблоне:
{% for book in all_books %}
<h3>{{ book.reader_set.all.count }}</h3>
{% endfor %}
Здесь будет показано количество читателей, связанных с каждой книгой.
Альтернативно, вы также можете использовать метод annotate в функции view для добавления поля num_readers к каждому объекту книги, которое затем можно отобразить в шаблоне, используя синтаксис {{ book.num_readers }}:
views.py:
def index(request):
all_readers = Reader.objects.all()
all_books = Book.objects.all().annotate(num_readers=Count('reader'))
context = {
"all_readers": all_readers,
"all_books": all_books,
}
return render(request, "testing/index.html", context)
index.html:
{% for book in all_books %}
<h3>{{ book.num_readers }}</h3>
{% endfor %}
Здесь также отображается количество читателей, связанных с каждой книгой.
Обычно рекомендуется выполнять как можно больше обработки данных в функции представления и передавать обработанные данные в шаблон, а не пытаться выполнять обработку данных в самом шаблоне. Это помогает сохранить код шаблона чистым и понятным, а также облегчает отладку любых проблем, которые могут возникнуть.