Django在模板中注释了值

时间:2012-02-28 00:42:46

标签: django django-templates django-queryset

是否可以在模板中的查询集上访问带注释的值?

例如,我有以下查询集,我将其传递给我的模板:

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 }}

看起来很好 - 但我相信第二个选项会重新计算视图数量。我想使用带注释的值,因为它应该已经计算好了。

1 个答案:

答案 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)