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'))