diff --git a/django/contrib/mongodb/compiler.py b/django/contrib/mongodb/compiler.py index 061a709574..5ad09ae13c 100644 --- a/django/contrib/mongodb/compiler.py +++ b/django/contrib/mongodb/compiler.py @@ -63,7 +63,6 @@ class SQLCompiler(object): assert not self.query.distinct assert not self.query.extra assert not self.query.having - assert self.query.high_mark is None filters = self.get_filters(self.query.where) cursor = self.connection.db[self.query.model._meta.db_table].find(filters) @@ -72,6 +71,10 @@ class SQLCompiler(object): (ordering.lstrip("-"), DESCENDING if ordering.startswith("-") else ASCENDING) for ordering in self.query.order_by ]) + if self.query.low_mark: + cursor = cursor.skip(self.query.low_mark) + if self.query.high_mark is not None: + cursor = cursor.limit(self.query.high_mark - self.query.low_mark) return cursor def results_iter(self): diff --git a/tests/regressiontests/mongodb/tests.py b/tests/regressiontests/mongodb/tests.py index f7ae0abaa6..0c3b74ef43 100644 --- a/tests/regressiontests/mongodb/tests.py +++ b/tests/regressiontests/mongodb/tests.py @@ -85,8 +85,35 @@ class MongoTestCase(TestCase): ], lambda g: g.name, ) - + def test_slicing(self): + artists = [ + Artist.objects.create(name="Huey Lewis"), + Artist.objects.create(name="John Hiatt"), + Artist.objects.create(name="Jackson Browne"), + Artist.objects.create(name="Rick Springfield"), + ] + + for i in xrange(5): + # TODO: should be i, but Mongo falls over with limit(0) + for j in xrange(i+1, 5): + self.assertQuerysetEqual( + Artist.objects.all()[i:j], + artists[i:j], + lambda a: a, + ) + self.assertQuerysetEqual( + Artist.objects.all()[:3], + artists[:3], + lambda a: a, + ) + + self.assertQuerysetEqual( + Artist.objects.all()[2:], + artists[2:], + lambda a: a, + ) + def test_not_equals(self): q = Group.objects.create(name="Queen", year_formed=1971) e = Group.objects.create(name="The E Street Band", year_formed=1972)