Django QuerySet exists() returns True for empty set?

Something curious I found recently is that exists() evaluates to True for an empty QuerySet:

   In [1]: MyModel.objects.all()
   Out [1]: <QuerySet []>

   In [2]: MyModel.objects.all().exists()
   Out [2]: True

When used with filter(), I get the expected result:

   In [3]: MyModel.objects.filter(id=1).exists()
   Out [3]: False

This is behaving contrary to how I would expect as the empty QuerySet returned by the filter() is equivalent to MyModel.objects.all() which is empty.

Why does this happen? It seems inconsistent.

Back to Top