Merge pull request #692 from rochacbruno/master

Updates with no operator should default to $set Fix #667
This commit is contained in:
Omer Katz 2014-07-03 09:02:12 +03:00
commit 67bf789fcf
3 changed files with 14 additions and 2 deletions

View File

@ -525,6 +525,13 @@ modifier comes before the field, not after it::
>>> post.tags
['database', 'nosql']
.. note::
If no modifier operator is specified the default will be ``$set``. So the following sentences are identical::
>>> BlogPost.objects(id=post.id).update(title='Example Post')
>>> BlogPost.objects(id=post.id).update(set__title='Example Post')
.. note::
In version 0.5 the :meth:`~mongoengine.Document.save` runs atomic updates

View File

@ -164,6 +164,9 @@ def update(_doc_cls=None, **update):
mongo_update.update(value)
continue
parts = key.split('__')
# if there is no operator, default to "set"
if len(parts) < 3 and parts[0] not in UPDATE_OPERATORS:
parts.insert(0, 'set')
# Check for an operator and transform to mongo-style if there is
op = None
if parts[0] in UPDATE_OPERATORS:

View File

@ -1074,11 +1074,13 @@ class InstanceTest(unittest.TestCase):
self.assertRaises(OperationError, update_no_value_raises)
def update_no_op_raises():
def update_no_op_should_default_to_set():
person = self.Person.objects.first()
person.update(name="Dan")
person.reload()
return person.name
self.assertRaises(InvalidQueryError, update_no_op_raises)
self.assertEqual("Dan", update_no_op_should_default_to_set())
def test_update_unique_field(self):
class Doc(Document):