diff --git a/django/db/models/base.py b/django/db/models/base.py index 08a81c9ab9..bc722de505 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -269,8 +269,8 @@ class Model(object): q._params.extend([param, param, getattr(self, self._meta.pk.attname)]) try: return q[0] - except IndexError, e: - raise self.DoesNotExist, e.args + except IndexError: + raise self.DoesNotExist, "%s matching query does not exist." % self.__class__._meta.object_name def _get_next_or_previous_in_order(self, is_next): cachename = "__%s_order_cache" % is_next diff --git a/django/db/models/query.py b/django/db/models/query.py index b8fc0c695f..61032602fa 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -129,7 +129,7 @@ class QuerySet(object): return list(self._clone(_offset=offset, _limit=limit))[::k.step] else: try: - return self._clone(_offset=k, _limit=1).get() + return list(self._clone(_offset=k, _limit=1))[0] except self.model.DoesNotExist, e: raise IndexError, e.args else: @@ -193,6 +193,7 @@ class QuerySet(object): def get(self, *args, **kwargs): "Performs the SELECT and returns a single object matching the given keyword arguments." clone = self.filter(*args, **kwargs) + # clean up SQL by removing unneeded ORDER BY if not clone._order_by: clone._order_by = () obj_list = list(clone) diff --git a/tests/modeltests/ordering/models.py b/tests/modeltests/ordering/models.py index de08a75755..8b56731c55 100644 --- a/tests/modeltests/ordering/models.py +++ b/tests/modeltests/ordering/models.py @@ -56,6 +56,10 @@ API_TESTS = """ >>> Article.objects.order_by('headline')[1:3] [Article 2, Article 3] +# Getting a single item should work too: +>>> Article.objects.all()[0] +Article 4 + # Use '?' to order randomly. (We're using [...] in the output to indicate we # don't know what order the output will be in. >>> Article.objects.order_by('?')