У Django QuerySet
есть два метода: annotate
и aggregate
. В документации сказано, что:
В отличие от aggregate (), annotate () не является терминальным предложением. Результатом предложения annotate () является QuerySet.
Есть ли еще какая-нибудь разница между ними? Если нет, то почему aggregate
существует?
django
django-queryset
Александр Артеменко
источник
источник
.annotate()
на qs не попадает в db, а на вызовеq[0].num_authors
? Я предполагаю, чтоaggregate
всегда должен попадать в db, поскольку это терминальное предложение?connection.queries
. Подсказка: проверьте, является лиbook = q[0]
запрос вызывающим или `book.num_authors`.В этом основное отличие, но агрегаты также работают в более широком масштабе, чем аннотации. Аннотации по своей сути связаны с отдельными элементами в наборе запросов. Если вы запустите
Count
аннотацию для чего-то вроде поля «многие ко многим», вы получите отдельный счетчик для каждого члена набора запросов (как добавленный атрибут). Однако, если бы вы сделали то же самое с агрегацией, она попыталась бы подсчитать все отношения для каждого члена набора запросов, даже дубликатов, и вернуть это как одно значение.источник
.annotate()
на qs не попадает в db, а вызывает результат аннотации, например,q[0].num_authors
делает? Я предполагаю, чтоaggregate
всегда должен попадать в db, поскольку это терминальное предложение?Aggregate Aggregate создает результирующие (сводные) значения для всего QuerySet. Aggregate работает с набором строк, чтобы получить одно значение из набора строк (например, сумма всех цен в наборе строк). Агрегат применяется ко всему QuerySet и генерирует результирующие (сводные) значения по всему QuerySet.
В модели:
В ракушке:
Annotate Annotate генерирует независимую сводку для каждого объекта в QuerySet. (Мы можем сказать, что он выполняет итерацию каждого объекта в QuerySet и применяет операцию)
В модели:
Ввиду:
В поле зрения он будет подсчитывать лайки для каждого видео
источник
distinct=True
требуется в последнем примере?