Fork me on GitHub

Often when one wants to determine how many objects are there in a Django model, they do so with:

from .models import Project

def my_view(request):
    project_count = Project.objects.all().count()
    return render(request, 'name-of-some-template.html', {'count': project_count})

Or filter objects based on a given codition like so:

from .models import Project

def my_view(request):
    projects = Project.objects.all().filter(user=request.user)
    return render(request, 'name-of-some-template.html', {'projects': projects})

Why is it a problem?

When you call all() before filter, you essentially, are actually constructing your queryset twice with one not being needed here. filter returns a new queryset already that contains objects matching the condition so need of all().

Simillarly, calling all() before count() is not neccessary because count() already does a SELECT COUNT(*) at the database level.

What can be done to resolve the problem?

Simply get rid of the preceding all(). So:

from .models import Project

def my_view(request):
    project_count = Project.objects.count()
    return render(request, 'name-of-some-template.html', {'count': project_count})

Or filter objects based on a given codition like so:

from .models import Project

def my_view(request):
    projects = Project.objects.filter(user=request.user)
    return render(request, 'name-of-some-template.html', {'projects': projects})