Force evaluate a lazy query

Here are all the ways to evaluate a lazy queryset. Using list is one of them:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated


Using list() will evaluate the query, retrieve all of its results, and add all of the data to the QuerySet's cache. That's potentially a lot of overhead if you're not actually planning to use the data.

You could instead use Catalog.objects.filter(q).exists() (see exists), which does not need to fetch the entire result set. Just note that it executes a different query, which will look something like this, depending on your DBMS:

SELECT (1) AS "a" FROM "..._catalog" LIMIT 1;

If you want to evaulate a query that is closer to what you'd originally be executing, you could do something like:

try:
    Catalog.objects.filter(q)[0]
except IndexError:
    pass

That will still add a LIMIT or TOP to your query, but at least your query will still include all the columns and orderings and such that your original query would have.

You might be tempted to do something like bool(Catalog.objects.filter(q)) or otherwise use the QuerySet in a boolean context, but note that that will behave as list(), fetching the entire set of results.

Tags:

Python

Django