Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Annotations | Complex Queries
Django ORM Ninja: Advanced Techniques for Developers

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.

python
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.

python
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.

python
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.

python
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.

python
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?

Select the correct answer

question mark

What does the following annotation query accomplish?

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

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 4
some-alt