2012-02-28 77 views
5

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

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

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

不应该在该“上下文[视频] = Videos.objects。 annotate(view_count = Count(views))。order_by(view_count)[:100]“be”context ['videos'] = Videos.objects.annotate(view_count = Count('views'))。order_by('view_count') [:100] “请发布您的实际代码,并且不要错过获得帮助的机会 – jpic 2012-02-28 01:12:57

回答

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)