why do DoesNotExist exceptions lack any useful information?

I am accustomed to KeyError giving me useful information. If you get KeyError("foobar"), you know that "foobar" was not found. But in Django, when you do User.objects.get(username="simon") for example, you get back User.DoesNotExist("User matching query does not exist."). There is no information in the exception’s args that I can’t already infer based on the type of the exception. Why must it be this way?

I made myself a wrapper function:

def get_object(model, **kwargs):
    try:
        return model.objects.get(**kwargs)
    except model.DoesNotExist as e:
        e.args = [str(kwargs)]
        raise

With this wrapper function you get back User.DoesNotExist("{'username': 'simon'}"). Is there a reason this should not be the default Django experience?

<conjecture>
My guess would be that it’s probably related to the issue that the .get method is applied to a queryset, and doesn’t necessarily have all the information to accurately report the conditions of the error.

As a trivial example, consider the following:
user.objects.filter(is_staff=True).exclude(is_supervisor=True).get(username='ken')

Reporting User.DoesNotExist("{'username': 'ken'}") isn’t really accurate, is it?

I’m guessing that all the information is there somewhere in the QuerySet object, but I’d also guess that the effort involved in digging it out to the point of producing a valid and useful error message probably exceeds the benefit obtained from doing so.
</conjecture>

Oh, that makes sense, thanks.