Aggregate
Aggregate genera valori di risultato (riepilogo) su un intero QuerySet. L'aggregazione opera sul set di righe per ottenere un singolo valore dal set di righe (ad esempio la somma di tutti i prezzi nel set di righe). Aggregate viene applicato all'intero QuerySet e genera valori di risultato (riepilogo) su un intero QuerySet.
Nel modello:
class Books(models.Model):
name = models.CharField(max_length=100)
pages = models.IntegerField()
price = models.DecimalField(max_digits=5, decimal_places=3)
Nel guscio:
>>> Books.objects.all().aggregate(Avg('price'))
# Above code will give the Average of the price Column
>>> {'price__avg': 34.35}
Annotate
Annotate genera un riepilogo indipendente per ogni oggetto in un QuerySet (possiamo dire che itera ogni oggetto in un QuerySet e applica l'operazione)
Nel modello:
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')
In vista:
videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)
In vista conterà i Mi piace per ogni video
.annotate()
su un qs da solo non colpisce il db, ma chiamandoq[0].num_authors
sì? Presumoaggregate
debba sempre premere il db in quanto è una clausola terminale?