Fixed QuerySetNoCache.count() caching (#410)
This commit is contained in:
parent
1e4d48d371
commit
6efd6faa3f
@ -4,6 +4,7 @@ Changelog
|
|||||||
|
|
||||||
Changes in 0.8.4
|
Changes in 0.8.4
|
||||||
================
|
================
|
||||||
|
- Fixed QuerySetNoCache.count() caching (#410)
|
||||||
- Don't follow references in _get_changed_fields (#422, #417)
|
- Don't follow references in _get_changed_fields (#422, #417)
|
||||||
- Allow args and kwargs to be passed through to_json (#420)
|
- Allow args and kwargs to be passed through to_json (#420)
|
||||||
|
|
||||||
|
@ -60,7 +60,6 @@ class BaseQuerySet(object):
|
|||||||
self._none = False
|
self._none = False
|
||||||
self._as_pymongo = False
|
self._as_pymongo = False
|
||||||
self._as_pymongo_coerce = False
|
self._as_pymongo_coerce = False
|
||||||
self._len = None
|
|
||||||
|
|
||||||
# If inheritance is allowed, only return instances and instances of
|
# If inheritance is allowed, only return instances and instances of
|
||||||
# subclasses of the class being used
|
# subclasses of the class being used
|
||||||
@ -331,14 +330,9 @@ 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:
|
if self._limit == 0 and with_limit_and_skip:
|
||||||
return 0
|
return 0
|
||||||
if with_limit_and_skip and self._len is not None:
|
return self._cursor.count(with_limit_and_skip=with_limit_and_skip)
|
||||||
return self._len
|
|
||||||
count = self._cursor.count(with_limit_and_skip=with_limit_and_skip)
|
|
||||||
if with_limit_and_skip:
|
|
||||||
self._len = count
|
|
||||||
return count
|
|
||||||
|
|
||||||
def delete(self, write_concern=None, _from_doc_delete=False):
|
def delete(self, write_concern=None, _from_doc_delete=False):
|
||||||
"""Delete the documents matched by the query.
|
"""Delete the documents matched by the query.
|
||||||
|
@ -94,6 +94,21 @@ class QuerySet(BaseQuerySet):
|
|||||||
except StopIteration:
|
except StopIteration:
|
||||||
self._has_more = False
|
self._has_more = False
|
||||||
|
|
||||||
|
def count(self, with_limit_and_skip=True):
|
||||||
|
"""Count the selected elements in the query.
|
||||||
|
|
||||||
|
:param with_limit_and_skip (optional): take any :meth:`limit` or
|
||||||
|
:meth:`skip` that has been applied to this cursor into account when
|
||||||
|
getting the count
|
||||||
|
"""
|
||||||
|
if with_limit_and_skip is False:
|
||||||
|
return super(QuerySet, self).count(with_limit_and_skip)
|
||||||
|
|
||||||
|
if self._len is None:
|
||||||
|
self._len = super(QuerySet, self).count(with_limit_and_skip)
|
||||||
|
|
||||||
|
return self._len
|
||||||
|
|
||||||
def no_cache(self):
|
def no_cache(self):
|
||||||
"""Convert to a non_caching queryset
|
"""Convert to a non_caching queryset
|
||||||
|
|
||||||
|
@ -3483,6 +3483,27 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
people.count() # count is cached
|
people.count() # count is cached
|
||||||
self.assertEqual(q, 1)
|
self.assertEqual(q, 1)
|
||||||
|
|
||||||
|
def test_no_cached_queryset(self):
|
||||||
|
class Person(Document):
|
||||||
|
name = StringField()
|
||||||
|
|
||||||
|
Person.drop_collection()
|
||||||
|
for i in xrange(100):
|
||||||
|
Person(name="No: %s" % i).save()
|
||||||
|
|
||||||
|
with query_counter() as q:
|
||||||
|
self.assertEqual(q, 0)
|
||||||
|
people = Person.objects.no_cache()
|
||||||
|
|
||||||
|
[x for x in people]
|
||||||
|
self.assertEqual(q, 1)
|
||||||
|
|
||||||
|
list(people)
|
||||||
|
self.assertEqual(q, 2)
|
||||||
|
|
||||||
|
people.count()
|
||||||
|
self.assertEqual(q, 3)
|
||||||
|
|
||||||
def test_cache_not_cloned(self):
|
def test_cache_not_cloned(self):
|
||||||
|
|
||||||
class User(Document):
|
class User(Document):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user