2012-02-28 31 views
5

Czy można uzyskać dostęp do adnotowanych wartości w zestawach zapytań w szablonach?Wartość adnotowana Django w szablonie

Na przykład mam następujące queryset że ja przechodząc do mojego szablonu:

context[videos] = Videos.objects.annotate(view_count=Count(views)).order_by(view_count)[:100] 

W moim szablonu Próbuję dostać widok liczyć tak:

{% for video in videos %} 
    {{ video.view_count }} 
{% endfor %} 

Która nic nie wyświetla.

Jednak jeśli używam:

{{ video.views.count }} 

Wydaje się w porządku - ale uważam, że druga opcja przelicza liczbę wyświetleń. Chciałbym użyć wartości z adnotacjami, ponieważ powinna już być obliczona.

+0

Gdyby nie ten „kontekst [wideo] = Videos.objects. adnotate (view_count = Count (views)). order_by (view_count) [: 100] kontekst "be" ['videos'] = Videos.objects.annotate (view_count = Count ('views')). order_by ('view_count') [: 100] "Proszę wpisać swój aktualny kod i nie przegap okazji, aby uzyskać pomoc – jpic

Odpowiedz

2

Byłoby sensowne, że QuerySet aggregation method per-item, annotate() ma takie imię, ponieważ annotates (zestawy) wartość zagregowaną dla każdego poz (przykład modelu) to plony, jak normalny dziedzinie, na przykład:

# 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 

O nazwach:

nazwa adnotacji jest automatycznie pochodzących od imienia kruszywa funkcja i nazwa zagregowanego pola. Można zastąpić tę domyślną nazwę dostarczając alias gdy podasz adnotacji:

>>> q = Book.objects.annotate(num_authors=Count('authors')) 
>>> q[0].num_authors 
2 
>>> q[1].num_authors 
1 

Na przykład:

context['videos'] = Videos.objects.annotate(view_count=Count('views')).order_by('-view_count')[100:] 

Można użyć:

[video.view_count for video in context['videos']] 

Which should be the same as korzystania values_list():

Videos.objects.annotate(view_count=Count('views')).values_list('view_count', flat=True) 

I podobna do:

{% for video in videos %} 
    {{ video.view_count }} 
{% endfor %} 

powiedział, że w przeciwieństwie do normalnych pól, the order in which filters are applied matters, zostałeś ostrzeżony B)

Powiązane problemy