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:
class Books(models.Model):
name = models.CharField(max_length=100)
pages = models.IntegerField()
price = models.DecimalField(max_digits=5, decimal_places=3)
Dans Shell:
>>> Books.objects.all().aggregate(Avg('price'))
# Above code will give the Average of the price Column
>>> {'price__avg': 34.35}
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:
class Video(models.Model):
name = models.CharField(max_length=52, verbose_name='Name')
video = models.FileField(upload_to=document_path, verbose_name='Upload
video')
created_by = models.ForeignKey(User, verbose_name='Created by',
related_name="create_%(class)s")
user_likes = models.ManyToManyField(UserProfile, null=True,
blank=True, help_text='User can like once',
verbose_name='Like by')
En vue:
videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)
En vue, il comptera les likes pour chaque vidéo
.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?