Merge pull request #1884 from erdenezul/limit_behavior

Clone of Limit behavior pr #1614
This commit is contained in:
erdenezul 2018-09-07 15:48:54 +08:00 committed by GitHub
commit d17cac8210
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 3 deletions

View File

@ -2,6 +2,11 @@
Changelog 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.15.4 Changes in 0.15.4
================= =================
- Added `DateField` #513 - Added `DateField` #513

View File

@ -396,7 +396,7 @@ class BaseQuerySet(object):
:meth:`skip` that has been applied to this cursor into account when :meth:`skip` that has been applied to this cursor into account when
getting the count 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 0
return self._cursor.count(with_limit_and_skip=with_limit_and_skip) return self._cursor.count(with_limit_and_skip=with_limit_and_skip)
@ -775,10 +775,11 @@ class BaseQuerySet(object):
"""Limit the number of returned documents to `n`. This may also be """Limit the number of returned documents to `n`. This may also be
achieved using array-slicing syntax (e.g. ``User.objects[:5]``). 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 = 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 a cursor object has already been created, apply the limit to it.
if queryset._cursor_obj: if queryset._cursor_obj:

View File

@ -125,6 +125,11 @@ class QuerySetTest(unittest.TestCase):
self.assertEqual(len(people2), 1) self.assertEqual(len(people2), 1)
self.assertEqual(people2[0], user_a) 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 # Test chaining of only after limit
person = self.Person.objects().limit(1).only('name').first() person = self.Person.objects().limit(1).only('name').first()
self.assertEqual(person, user_a) self.assertEqual(person, user_a)
@ -5272,6 +5277,16 @@ class QuerySetTest(unittest.TestCase):
# in a way we'd expect) should raise a TypeError, too # in a way we'd expect) should raise a TypeError, too
self.assertRaises(TypeError, BlogPost.objects(authors__in=author).count) self.assertRaises(TypeError, BlogPost.objects(authors__in=author).count)
def test_create_count(self):
self.Person.drop_collection()
self.Person.objects.create(name="Foo")
self.Person.objects.create(name="Bar")
self.Person.objects.create(name="Baz")
self.assertEqual(self.Person.objects.count(with_limit_and_skip=True), 3)
newPerson = self.Person.objects.create(name="Foo_1")
self.assertEqual(self.Person.objects.count(with_limit_and_skip=True), 4)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()