Django QuerySet
tiene dos métodos annotate
y 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é aggregate
existe?
django
django-queryset
Alexander Artemenko
fuente
fuente
.annotate()
en un qs solo no llega a la base de datos, pero llamarq[0].num_authors
sí? Supongoaggregate
que 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
Count
anotació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_authors
hace? Supongoaggregate
que 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=True
Por qué se requiere en el último ejemplo?