Queries may now use multiple operators on fields

This commit is contained in:
Harry Marr 2009-11-23 18:16:41 +00:00
parent d46191159e
commit 1529fd901d
3 changed files with 11 additions and 1 deletions

View File

@ -37,12 +37,16 @@ class QuerySet(object):
for key, value in query.items(): for key, value in query.items():
parts = key.split('__') parts = key.split('__')
# Check for an operator and transform to mongo-style if there is # Check for an operator and transform to mongo-style if there is
op = None
if parts[-1] in operators: if parts[-1] in operators:
op = parts.pop() op = parts.pop()
value = {'$' + op: value} value = {'$' + op: value}
key = '.'.join(parts) key = '.'.join(parts)
mongo_query[key] = value if op is None or key not in mongo_query:
mongo_query[key] = value
elif key in mongo_query and isinstance(mongo_query[key], dict):
mongo_query[key].update(value)
return mongo_query return mongo_query

View File

@ -246,6 +246,8 @@ class DocumentTest(unittest.TestCase):
content = StringField() content = StringField()
author = ReferenceField(self.Person) author = ReferenceField(self.Person)
BlogPost.drop_collection()
author = self.Person(name='Test User') author = self.Person(name='Test User')
author.save() author.save()

View File

@ -31,6 +31,10 @@ class QuerySetTest(unittest.TestCase):
{'name': 'test', 'age': 30}) {'name': 'test', 'age': 30})
self.assertEqual(QuerySet._transform_query(age__lt=30), self.assertEqual(QuerySet._transform_query(age__lt=30),
{'age': {'$lt': 30}}) {'age': {'$lt': 30}})
self.assertEqual(QuerySet._transform_query(age__gt=20, age__lt=50),
{'age': {'$gt': 20, '$lt': 50}})
self.assertEqual(QuerySet._transform_query(age=20, age__gt=50),
{'age': 20})
self.assertEqual(QuerySet._transform_query(friend__age__gte=30), self.assertEqual(QuerySet._transform_query(friend__age__gte=30),
{'friend.age': {'$gte': 30}}) {'friend.age': {'$gte': 30}})
self.assertEqual(QuerySet._transform_query(name__exists=True), self.assertEqual(QuerySet._transform_query(name__exists=True),