Было бы разумно, чтобы метод агрегации 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)