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})