Added slave_okay syntax to querysets.

* slave_okay (optional): if True, allows this query to be run against a replica secondary.
This commit is contained in:
Ross Lawley 2011-06-06 14:35:46 +01:00
parent 56f00a64d7
commit 55e20bda12
2 changed files with 19 additions and 1 deletions

View File

@ -336,6 +336,7 @@ class QuerySet(object):
self._snapshot = False
self._timeout = True
self._class_check = True
self._slave_okay = False
# If inheritance is allowed, only return instances and instances of
# subclasses of the class being used
@ -430,7 +431,7 @@ class QuerySet(object):
return spec
def __call__(self, q_obj=None, class_check=True, **query):
def __call__(self, q_obj=None, class_check=True, slave_okay=False, **query):
"""Filter the selected documents by calling the
:class:`~mongoengine.queryset.QuerySet` with a query.
@ -440,6 +441,8 @@ class QuerySet(object):
objects, only the last one will be used
:param class_check: If set to False bypass class name check when
querying collection
:param slave_okay: if True, allows this query to be run against a
replica secondary.
:param query: Django-style query keyword arguments
"""
query = Q(**query)
@ -449,6 +452,7 @@ class QuerySet(object):
self._mongo_query = None
self._cursor_obj = None
self._class_check = class_check
self._slave_okay = slave_okay
return self
def filter(self, *q_objs, **query):
@ -506,6 +510,7 @@ class QuerySet(object):
cursor_args = {
'snapshot': self._snapshot,
'timeout': self._timeout,
'slave_okay': self._slave_okay
}
if self._loaded_fields:
cursor_args['fields'] = self._loaded_fields.as_dict()

View File

@ -413,6 +413,19 @@ class QuerySetTest(unittest.TestCase):
obj_id = Blog.objects.insert(blog1, load_bulk=False)
self.assertEquals(obj_id.__class__.__name__, 'ObjectId')
def test_slave_okay(self):
"""Ensures that a query can take slave_okay syntax
"""
person1 = self.Person(name="User A", age=20)
person1.save()
person2 = self.Person(name="User B", age=30)
person2.save()
# Retrieve the first person from the database
person = self.Person.objects(slave_okay=True).first()
self.assertTrue(isinstance(person, self.Person))
self.assertEqual(person.name, "User A")
self.assertEqual(person.age, 20)
def test_repeated_iteration(self):
"""Ensure that QuerySet rewinds itself one iteration finishes.