是否可以在模板中的查询集上访问带注释的值?
例如,我有以下查询集,我将其传递给我的模板:
context[videos] = Videos.objects.annotate(view_count=Count(views)).order_by(view_count)[:100]
在我的模板中,我试图让视图计数如下:
{% for video in videos %}
{{ video.view_count }}
{% endfor %}
没有显示任何内容。
但是,如果我使用:
{{ video.views.count }}
看起来很好 - 但我相信第二个选项会重新计算视图数量。我想使用带注释的值,因为它应该已经计算好了。
答案 0 :(得分:2)
QuerySet aggregation method per-item, annotate()有这样的名称是有意义的,因为它注释(设置)聚合值到每个项(模型实例)它产量,像普通字段,例如:
# Build an annotated queryset
>>> q = Book.objects.annotate(Count('authors'))
# Interrogate the first object in the queryset
>>> q[0]
<Book: The Definitive Guide to Django>
>>> q[0].authors__count
2
# Interrogate the second object in the queryset
>>> q[1]
<Book: Practical Django Projects>
>>> q[1].authors__count
1
关于名称:
注释的名称自动从聚合函数的名称和要聚合的字段的名称派生。您可以通过在指定注释时提供别名来覆盖此默认名称:
>>> q = Book.objects.annotate(num_authors=Count('authors'))
>>> q[0].num_authors
2
>>> q[1].num_authors
1
例如:
context['videos'] = Videos.objects.annotate(view_count=Count('views')).order_by('-view_count')[100:]
您可以使用:
[video.view_count for video in context['videos']]
哪个should be the same as使用values_list():
Videos.objects.annotate(view_count=Count('views')).values_list('view_count', flat=True)
类似于:
{% for video in videos %}
{{ video.view_count }}
{% endfor %}
那就是说,不像普通字段,the order in which filters are applied matters,你已被警告过B)