Django аннотированное значение в шаблоне - PullRequest
6 голосов
/ 28 февраля 2012

Можно ли получить доступ к аннотированным значениям в наборах запросов в шаблонах?

Например, у меня есть следующий набор запросов, который я передаю своему шаблону:

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 Ответ

2 голосов
/ 28 февраля 2012

Было бы разумно, чтобы метод агрегации QuerySet для каждого элемента, 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']]

Который должен совпадать с с использованием values_list () :

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

И похоже на:

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

Тем не менее, в отличие от обычных полей , порядок, в котором применяются фильтры, имеет значение , вы были предупреждены B)

...