django 查询注释值从反向外键获取列表

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<strong>.prefetch_related('blog_set')</strong>

然后在模板中,您可以渲染:

<ul>
  {% for author in authors %}
    <li>{{ author }}</li>
    <ul>
      {% for <strong>blog in author.blog_set.all</strong> %}
        <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'))