Подсчет всех записей во вторичной таблице в отношениях 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 %}

Здесь также отображается количество читателей, связанных с каждой книгой.

Обычно рекомендуется выполнять как можно больше обработки данных в функции представления и передавать обработанные данные в шаблон, а не пытаться выполнять обработку данных в самом шаблоне. Это помогает сохранить код шаблона чистым и понятным, а также облегчает отладку любых проблем, которые могут возникнуть.

Вернуться на верх