Junior — Middle
Could you explain how to improve query performance when using Django ORM?
sobes.tech AI
Answer from AI
To improve query performance in Django ORM, several approaches can be used:
- select_related() — for eager loading of related objects via ForeignKey or OneToOneField, reducing the number of SQL queries.
- prefetch_related() — for loading related objects ManyToMany or reverse relations, performs a separate query but optimizes data retrieval.
- values() and values_list() — for selecting only necessary fields, reducing the amount of data transferred.
- annotate() and aggregate() — for performing calculations at the database level, reducing processing in Python.
- Using QuerySet.exists() instead of fetching all objects when checking for existence.
- Caching query results if data does not change often.
Example of using select_related:
# Without select_related: 1 query for books + N queries for authors
books = Book.objects.all()
for book in books:
print(book.author.name)
# With select_related: 1 JOIN query
books = Book.objects.select_related('author').all()
for book in books:
print(book.author.name)