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'))
我有一个像
这样的简单模型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'))