Member-only story

Django Developers, Stop Using .all() for Queries – Here’s Why!

3 min readFeb 21, 2025
Photo by Nadine E on Unsplash

Django’s ORM is powerful, but using .all() indiscriminately can lead to performance bottlenecks, unnecessary database hits, and inefficient query execution. If you’re guilty of writing Model.objects.all() in your views, APIs, or business logic without a second thought, this article will change the way you approach Django queries forever!

The Problem with .all()

When you use:

users = User.objects.all()

It doesn’t fetch all records immediately — it creates a QuerySet that fetches data only when evaluated. But the real issue comes when you use it incorrectly, leading to unexpected database hits, inefficient memory usage, and performance degradation.

1. Lazy QuerySets & Unexpected Evaluations

Django QuerySets are lazy, meaning they don’t hit the database until explicitly evaluated. But the problem arises when you don’t control where and when evaluation happens.

Bad Practice:

users = User.objects.all()
for user in users:
print(user.email)

Better Approach: Use .values_list() or .values() to fetch only necessary fields.

users = User.objects.values_list("email", flat=True)…

--

--

Aashish Kumar
Aashish Kumar

Written by Aashish Kumar

Hi, I’m Aashish Kumar, a passionate software engineer from India 🇮🇳, specialize in Python | Django | AI | LLM | Full Stack Development.

Responses (2)