Django ORM для цикла для получения набора запросов

Я пытаюсь использовать цикл for для получения списка автора с количеством написанных книг и автора с названием написанной книги. Вот мой models.py

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

Я пытался выполнить цикл следующим образом:

for a in Author.all():
    books = a.book_set.order_by('author')
    print(books)

Я получаю авторов в том виде, в котором они находятся в БД. Также,

for book in book_set.iterator():
...     print(book.title)

Я получил список всех книг.

Я использовал author_list = Author.objects.order_by("book").count(), который выдавал количество авторов. Как я могу пройтись по БД и получить Автора с количеством книг, и Авторов с названием написанной книги.

Предположим, что вы хотите перечислить всех остальных с их первыми 5 книгами (отсортированными по алфавиту) и общим количеством книг на одной странице с помощью одной выборки, вам нужно использовать aggregations/annotations.

Author.objects.annotate(
    book_count=Count('book'),
    book_list=ArrayAgg('book__title', ordering='book__title')
).order_by('name').all()

В вашем шаблоне:

{% for author in author_list %}
    {author.name} ({author.book_count}):
    <ul>
    {% for book_title in author.book_list %}
        <li>{book_title}</li>
    {% endfor %}
    </ul>
{% endfor %}

Это всего лишь ПРОБНЫЙ И НЕПРОВЕРЕННЫЙ вариант. Это просто для начала работы. Пожалуйста, обратитесь к документации. Он использует специфичный для postgres ArrayAgg.

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