Django QuerySet
a deux méthodes, annotate
et aggregate
. La documentation dit que:
Contrairement à aggregate (), annotate () n'est pas une clause terminale. La sortie de la clause annotate () est un QuerySet.
Y a-t-il une autre différence entre eux? Sinon, pourquoi aggregate
existe-t-il?
django
django-queryset
Alexandre Artemenko
la source
la source
.annotate()
sur un qs seul ne touche pas la base de données, mais l'appel leq[0].num_authors
fait? Je suppose queaggregate
doit toujours frapper la base de données car il s'agit d'une clause terminale?connection.queries
. Astuce: vérifiez si c'est lebook = q[0]
ou `book.num_authors` qui provoque la requête.C'est la principale différence, mais les agrégats fonctionnent également à une plus grande échelle que les annotations. Les annotations sont intrinsèquement liées aux éléments individuels d'un ensemble de requêtes. Si vous exécutez une
Count
annotation sur quelque chose comme un champ plusieurs-à-plusieurs, vous obtiendrez un décompte distinct pour chaque membre de l'ensemble de requêtes (en tant qu'attribut ajouté). Si vous deviez faire de même avec une agrégation, cependant, il essaierait de compter chaque relation sur chaque membre de l'ensemble de requêtes, même les doublons, et de renvoyer cela comme une seule valeur.la source
.annotate()
sur un qs seul ne frappe pas la base de données, mais appelle le résultat d'une annotation comme leq[0].num_authors
fait? Je suppose queaggregate
doit toujours frapper la base de données car il s'agit d'une clause terminale?Agrégat Aggregate génère des valeurs de résultat (récapitulatives) sur un ensemble de requêtes entier. L'agrégation opère sur l'ensemble de lignes pour obtenir une valeur unique de l'ensemble de lignes (par exemple, la somme de tous les prix de l'ensemble de lignes). L'agrégat est appliqué à l'ensemble de QuerySet et génère des valeurs de résultat (récapitulatif) sur l'ensemble d'un QuerySet.
Dans le modèle:
Dans Shell:
Annoter Annoter générer un résumé indépendant pour chaque objet dans un QuerySet (nous pouvons dire qu'il itère chaque objet dans un QuerySet et applique une opération)
Dans le modèle:
En vue:
En vue, il comptera les likes pour chaque vidéo
la source
distinct=True
est requis dans le dernier exemple?