【问题标题】:Django annotated value in template模板中的Django注释值
【发布时间】:2012-03-17 11:57:09
【问题描述】:

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

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

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

看起来不错 - 但我相信第二个选项会重新计算观看次数。我想使用带注释的值,因为它应该已经计算过了。

【问题讨论】:

  • 这个“context[videos] = Videos.objects.annotate(view_count=Count(views)).order_by(view_count)[:100]”不应该是“context['videos'] = Videos.objects.annotate(view_count=Count('views')).order_by('view_count')[:100] "请发布您的实际代码,不要错过获得帮助的机会

标签: django django-templates django-queryset


【解决方案1】:

QuerySet aggregation method per-item, annotate() 有这样的名字是有道理的,因为它注释(设置)它产生的每个 item(模型实例)的聚合值, 像一个普通的字段,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 2019-02-19
    • 1970-01-01
    • 2010-10-17
    • 2018-11-25
    • 1970-01-01
    • 2018-04-28
    • 2014-10-19
    相关资源
    最近更新 更多