| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user