Django query annotate values get list from reverse foreign key

У меня есть простая модель типа

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

    def __str__(self):
        return self.name



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

Здесь я хочу запросить всех авторов с названиями всех блогов, которые они написали, как

Author One : [Blog One, Blog Two, Blog Three]

Я хочу получить это из запроса, а не из цикла

Здесь мой подход заключается в использовании подзапроса типа

blogs =Blog.objects.filter(author=OuterRef('pk')).values("title")
authors = Author.objects.annotate(blogs=Subquery(blogs), output_field=CharField())

Но здесь я получаю ошибку типа sub-select returns 2 columns - expected 1

Как я могу получить всех авторов со всеми блогами, которые они написали? Я не хочу использовать цикл. Я хочу получить это через запрос

Вы можете сделать запрос с помощью:

authors = Author.objects.prefetch_related('blog_set')

Затем в шаблоне вы можете выполнить рендеринг с:

<ul>
  {% for author in authors %}
    <li>{{ author }}</li>
    <ul>
      {% for blog in author.blog_set.all %}
        <li>{{ blog }}</li>
      {% endfor %}
    </ul>
  {% endfor %}
</ul>

Если вы используете postgres в качестве базы данных, то вы можете использовать функцию ArrayAgg:

from django.contrib.postgres.aggregates import ArrayAgg

authors = Author.objects.annotate(blogs=ArrayAgg('blog_set__title'))
Вернуться на верх