diff --git a/django/db/models/query.py b/django/db/models/query.py index 61032602fa7..1107269235b 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -95,6 +95,9 @@ class QuerySet(object): def __getitem__(self, k): "Retrieve an item or slice from the set of results." + assert (not isinstance(k, slice) and (k >= 0)) \ + or (isinstance(k, slice) and (k.start is None or k.start >= 0) and (k.stop is None or k.stop >= 0)), \ + "Negative indexing is not supported." if self._result_cache is None: if isinstance(k, slice): # Offset: diff --git a/tests/modeltests/basic/models.py b/tests/modeltests/basic/models.py index 0470d6bc9b3..f60c3777e7c 100644 --- a/tests/modeltests/basic/models.py +++ b/tests/modeltests/basic/models.py @@ -283,6 +283,16 @@ Traceback (most recent call last): ... AssertionError: Cannot combine queries once a slice has been taken. +# Negative slices are not supported, due to database constraints. +# (hint: inverting your ordering might do what you need). +>>> Article.objects.all()[-1] +Traceback (most recent call last): + ... +AssertionError: Negative indexing is not supported. +>>> Article.objects.all()[0:-5] +Traceback (most recent call last): + ... +AssertionError: Negative indexing is not supported. # An Article instance doesn't have access to the "objects" attribute. # That's only available on the class.