Django exists() versus DoesNotExist Django exists() versus DoesNotExist python python

Django exists() versus DoesNotExist


if User.objects.get(pk=id).exists()

This won't work, so the question is pretty easy to answer: This way is inferior to the ways which do work :-)

I guess you actually didn't make a Minimal Complete Verifiable Example and so missed the error when you posted un-verified code.


So instead, I suppose you are asking about the difference between:

  • QuerySet.exists() when you have a QuerySet (e.g. from a filter operation).

    For example:

  if User.objects.filter(pk=id).exists():      # ... do the things that need that user to exist
  try:      user = User.objects.get(pk=id)  except User.DoesNotExist:      # ... handle the case of that user not existing

The difference is:

  • The QuerySet.exists method is on a queryset, meaning you ask it about a query (“are there any instances matching this query?”), and you're not yet attempting to retrieve any specific instance.

  • The DoesNotExist exception for a model is raised when you actually attempted to retrieve one instance, and it didn't exist.

Use whichever one correctly expresses your intention.


You can find more info in docs:about exists(),but exists() works only for QuerySet

Returns True if the QuerySet contains any results, and False if not. This tries to perform the query in the simplest and fastest way possible, but it does execute nearly the same query as a normal QuerySet query.

exists() is useful for searches relating to both object membership in a QuerySet and to the existence of any objects in a QuerySet, particularly in the context of a large QuerySet.

But ObjectDoesNotExist works only with get().

Also you can try another approach:

user = User.objects.filter(id=2)if user:    # put your logic    pass


in django model,if you gonna use model.objects.get() if it wasn't exist it raise an error. in that case you can use DoesNotExist along with except:

try:  val = Model.objects.get(pk=val) # if nothing found it will raise an exceptionexception:  you can trace an exception without mentioning anything on top.(or)exception ObjectDoesNotExist:  # it will come here if exception is DoesNotExist