Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Annotations | Complex Queries
Django ORM Ninja: Técnicas Avanzadas para Desarrolladores

book
Annotations

Annotation in Django ORM allows you to attach additional information to each object in a QuerySet. It's a powerful feature for augmenting the results of queries with calculated values, which can be aggregates computed over related objects or values derived from model fields.

Basic Annotation

Example 1:

Assume each Book has a pages field. This annotates each genre with the total number of pages of all books within that genre.

from django.db.models import Sum

genre_with_page_count = Genre.objects.annotate(total_pages=Sum('book__pages'))

Example 2:

Assume each Book has a rating field.

from django.db.models import Avg

author_with_avg_rating = Author.objects.annotate(avg_rating=Avg('book__rating'))

Adds an average rating for the books written by each author.

Advanced Annotation Use Cases

Example 1:

Assume each Book has a publication_date field.

from django.db.models import Count, F, Year

books_per_year = Author.objects.annotate(year=F('book__publication_date__year')).values('year').annotate(count=Count('book'))

Counts how many books each author published per year.

Example 2:

Finds the most recently published book for each genre.

from django.db.models import Max

latest_book_per_genre = Genre.objects.annotate(latest_book=Max('book__publication_date'))

Annotation with Filters

Example 1:

Counts the number of fantasy books written by each author.

author_genre_count = Author.objects.filter(book__genre__name='Fantasy').annotate(fantasy_books_count=Count('book'))

1. What is the primary purpose of annotation in Django ORM?

2. What does the following annotation query accomplish?

question mark

What is the primary purpose of annotation in Django ORM?

Selecciona la respuesta correcta

question mark

What does the following annotation query accomplish?

Author.objects.annotate(year=F('book__publication_date__year')).values('year').annotate(count=Count('book'))

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 4
some-alt