2012-02-28 30 views
5

¿Es posible acceder a los valores anotados en los conjuntos de consulta en las plantillas?Valor anotado de Django en la plantilla

Por ejemplo tengo el siguiente conjunto de consultas que estoy pasando a mi plantilla:

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

En mi plantilla que estoy tratando de obtener la vista recuento de la siguiente manera:

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

Qué no muestra nada

Sin embargo si uso:

{{ video.views.count }} 

Parece bien - pero creo que la segunda opción vuelve a calcular el número de reproducciones. Me gustaría utilizar el valor anotado ya que ya debería calcularse.

+0

En caso de que no este "contexto [videos] = Videos.objects. anotar (view_count = Count (views)) order order_by (view_count) [: 100] contexto "be" ['videos'] = Videos.objects.annotate (view_count = Count ('views')) order_by ('view_count') [: 100] "Publique su código real por favor y no pierda la oportunidad de obtener ayuda – jpic

Respuesta

2

No tendría sentido que el QuerySet aggregation method per-item, annotate(), tiene un nombre tal porque anota (conjuntos) el valor agregado a cada artículo (instancia de modelo) que los rendimientos, como un campo normal, por ejemplo:

# 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 

Acerca de los nombres:

el nombre de la anotación se deriva automáticamente del nombre del agregado función y el nombre del campo que se agrega. Puede anular este nombre por defecto al proporcionar un alias cuando se especifica la anotación:

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

Por ejemplo, con:

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

que puede usar:

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

Qué should be the same as usando values_list():

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

Y similar a:

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

Dicho esto, a diferencia de los campos normales , the order in which filters are applied matters, que ha sido advertido B)

Cuestiones relacionadas