From 2a795e91381053294cc9bf312f785b5ed9f1ab49 Mon Sep 17 00:00:00 2001 From: Ali Date: Fri, 4 Aug 2017 11:31:29 +0100 Subject: [PATCH] QuerySet limit function now returns all docs in cursor when 0 is passed --- docs/changelog.rst | 1 + mongoengine/queryset/base.py | 7 ++++--- tests/queryset/queryset.py | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index c60bbf09..aa8584a7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Development =========== +- QuerySet limit function behaviour: Passing 0 as parameter will return all the documents in the cursor #1611 - (Fill this out as you fix issues and develop your features). Changes in 0.14.0 diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 6f9c372c..be4b9d66 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -384,7 +384,7 @@ class BaseQuerySet(object): :meth:`skip` that has been applied to this cursor into account when getting the count """ - if self._limit == 0 and with_limit_and_skip or self._none: + if self._limit == 0 and with_limit_and_skip is False or self._none: return 0 return self._cursor.count(with_limit_and_skip=with_limit_and_skip) @@ -759,10 +759,11 @@ class BaseQuerySet(object): """Limit the number of returned documents to `n`. This may also be achieved using array-slicing syntax (e.g. ``User.objects[:5]``). - :param n: the maximum number of objects to return + :param n: the maximum number of objects to return if n is greater than 0. + When 0 is passed, returns all the documents in the cursor """ queryset = self.clone() - queryset._limit = n if n != 0 else 1 + queryset._limit = n # If a cursor object has already been created, apply the limit to it. if queryset._cursor_obj: diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index c78ed985..ac545629 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -124,6 +124,11 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(len(people2), 1) self.assertEqual(people2[0], user_a) + # Test limit with 0 as parameter + people = self.Person.objects.limit(0) + self.assertEqual(people.count(with_limit_and_skip=True), 2) + self.assertEqual(len(people), 2) + # Test chaining of only after limit person = self.Person.objects().limit(1).only('name').first() self.assertEqual(person, user_a)