What is a lazy QuerySet in Django? Explain select_related and prefetch_related — what are they used for, and how do they differ?
sobes.tech AI
Answer from AI
Lazy QuerySet in Django is an object that does not execute a database query immediately upon creation but delays execution until the data is actually needed (for example, when iterating or converting to a list). This allows optimizing database operations and avoiding unnecessary queries.
select_related and prefetch_related are query optimization methods when working with related models:
-
select_related uses SQL JOIN and fetches related objects in a single query. It works only with ForeignKey and OneToOne fields. Suitable when you need to get related objects "closely".
-
prefetch_related performs a separate query for related objects and then links them in Python. It works with any relations, including ManyToMany. Used when there are many related objects or when select_related is not suitable.
Example:
# select_related
books = Book.objects.select_related('author').all()
for book in books:
print(book.author.name) # does not trigger an additional query
# prefetch_related
authors = Author.objects.prefetch_related('books').all()
for author in authors:
for book in author.books.all():
print(book.title) # books are loaded with one additional query
Thus, these methods help reduce the number of queries and improve performance.