Use .get(…) to retrieve the object in a view ‹ antipattern ‹ Django antipatterns Fork me on GitHub

In a view, people often retrieve the object with the .get(…) [Django-doc] call, for example:

def post_details(request, pk):
    mypost = Post.objects.get(pk=pk)
    # …

Why is it a problem?

If no such Post object exists, then the call will raise a Post.DoesNotExist exception. If this exception is not handled properly, it means that the server will return a HTTP 500 response, which means that the error should be at the server side, but here the problem is at the client side, since there simply exists no Post for the given primary key.

What can be done to resolve the problem?

We can make use of get_object_or_404(…) [Django-doc]. This function will raise a Http404 exception in case the model object does not exists. This will then be handled by Django and eventually a HTTP 404 response will be returned:

from django.shortcuts import get_object_or_404

def post_details(request, pk):
    mypost = get_object_or_404(Post, pk=pk)
    # …