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.