Django QuerySettiene dos métodos annotatey aggregate. La documentación dice que:
A diferencia de aggregate (), annotate () no es una cláusula terminal. La salida de la cláusula annotate () es un QuerySet.
¿Existe alguna otra diferencia entre ellos? Si no es así, ¿por qué aggregateexiste?
django
django-queryset
Alexander Artemenko
fuente
fuente

.annotate()en un qs solo no llega a la base de datos, pero llamarq[0].num_authorssí? Supongoaggregateque siempre debe presionar la base de datos, ya que es una cláusula terminal.connection.queries. Sugerencia: compruebe si es elbook = q[0]o `book.num_authors` lo que provoca la consulta.Esa es la principal diferencia, pero los agregados también funcionan a una escala mayor que las anotaciones. Las anotaciones están intrínsecamente relacionadas con elementos individuales en un conjunto de consultas. Si ejecuta una
Countanotación en algo así como un campo de muchos a muchos, obtendrá un recuento por separado para cada miembro del conjunto de consultas (como un atributo agregado). Sin embargo, si hiciera lo mismo con una agregación, intentaría contar todas las relaciones en cada miembro del conjunto de consultas, incluso las duplicadas, y devolverlas como un solo valor.fuente
.annotate()en una qs no llega a la base de datos, pero llamando al resultado de una anotación como loq[0].num_authorshace? Supongoaggregateque siempre debe presionar la base de datos, ya que es una cláusula terminal.Agregar agregado genera valores de resultado (resumen) en todo un QuerySet. El agregado opera sobre el conjunto de filas para obtener un valor único del conjunto de filas (por ejemplo, la suma de todos los precios en el conjunto de filas). El agregado se aplica en todo el QuerySet y genera valores de resultado (resumen) en todo un QuerySet.
En modelo:
En Shell:
Anotar Anotar generar un resumen independiente para cada objeto en un QuerySet. (Podemos decir que iterar cada objeto en un QuerySet y aplicar la operación)
En modelo:
En vista:
A la vista, contará los me gusta de cada video.
fuente
distinct=TruePor qué se requiere en el último ejemplo?