Added support for addToSet and each

fixes MongoEngine/mongoengine#33
This commit is contained in:
Ross Lawley 2012-07-11 14:22:50 +01:00
parent 7a1b110f62
commit b58bf3e0ce
4 changed files with 31 additions and 3 deletions

View File

@ -2,6 +2,10 @@
Changelog Changelog
========= =========
Changes in 0.6.14
=================
- Added support for add_to_set and each
Changes in 0.6.13 Changes in 0.6.13
================ ================
- Fixed EmbeddedDocument db_field validation issue - Fixed EmbeddedDocument db_field validation issue

View File

@ -1387,11 +1387,16 @@ class QuerySet(object):
# Convert value to proper value # Convert value to proper value
field = cleaned_fields[-1] field = cleaned_fields[-1]
if op in (None, 'set', 'push', 'pull', 'addToSet'): if op in (None, 'set', 'push', 'pull'):
if field.required or value is not None: if field.required or value is not None:
value = field.prepare_query_value(op, value) value = field.prepare_query_value(op, value)
elif op in ('pushAll', 'pullAll'): elif op in ('pushAll', 'pullAll'):
value = [field.prepare_query_value(op, v) for v in value] value = [field.prepare_query_value(op, v) for v in value]
elif op == 'addToSet':
if isinstance(value, (list, tuple, set)):
value = [field.prepare_query_value(op, v) for v in value]
elif field.required or value is not None:
value = field.prepare_query_value(op, value)
key = '.'.join(parts) key = '.'.join(parts)
@ -1407,6 +1412,8 @@ class QuerySet(object):
parts.reverse() parts.reverse()
for key in parts: for key in parts:
value = {key: value} value = {key: value}
elif op == 'addToSet' and isinstance(value, list):
value = {key: {"$each": value}}
else: else:
value = {key: value} value = {key: value}
key = '$' + op key = '$' + op

View File

@ -10,4 +10,4 @@ cover-html-dir = ../htmlcov
cover-package = mongoengine cover-package = mongoengine
cover-erase = 1 cover-erase = 1
where = tests where = tests
#tests = test_bugfix.py tests = test_bugfix.py

View File

@ -1520,7 +1520,7 @@ class QuerySetTest(unittest.TestCase):
BlogPost.drop_collection() BlogPost.drop_collection()
def test_update_push_and_pull(self): def test_update_push_and_pull_add_to_set(self):
"""Ensure that the 'pull' update operation works correctly. """Ensure that the 'pull' update operation works correctly.
""" """
class BlogPost(Document): class BlogPost(Document):
@ -1553,6 +1553,23 @@ class QuerySetTest(unittest.TestCase):
post.reload() post.reload()
self.assertEqual(post.tags, ["code", "mongodb"]) self.assertEqual(post.tags, ["code", "mongodb"])
def test_add_to_set_each(self):
class Item(Document):
name = StringField(required=True)
description = StringField(max_length=50)
parents = ListField(ReferenceField('self'))
Item.drop_collection()
item = Item(name='test item').save()
parent_1 = Item(name='parent 1').save()
parent_2 = Item(name='parent 2').save()
item.update(add_to_set__parents=[parent_1, parent_2, parent_1])
item.reload()
self.assertEqual([parent_1, parent_2], item.parents)
def test_pull_nested(self): def test_pull_nested(self):
class User(Document): class User(Document):