Merge pull request #626 from KonishchevDmitry/pr-not-unique-error-on-update

Raise NotUniqueError in Document.update() on pymongo.errors.DuplicateKeyError
This commit is contained in:
Yohan Graterol 2014-06-25 10:18:09 -05:00
commit a70dbac0e6
2 changed files with 13 additions and 1 deletions

View File

@ -459,6 +459,8 @@ class BaseQuerySet(object):
return result return result
elif result: elif result:
return result['n'] return result['n']
except pymongo.errors.DuplicateKeyError, err:
raise NotUniqueError(u'Update failed (%s)' % unicode(err))
except pymongo.errors.OperationFailure, err: except pymongo.errors.OperationFailure, err:
if unicode(err) == u'multi not coded yet': if unicode(err) == u'multi not coded yet':
message = u'update() method requires MongoDB 1.1.3+' message = u'update() method requires MongoDB 1.1.3+'

View File

@ -15,7 +15,7 @@ from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest,
from mongoengine import * from mongoengine import *
from mongoengine.errors import (NotRegistered, InvalidDocumentError, from mongoengine.errors import (NotRegistered, InvalidDocumentError,
InvalidQueryError) InvalidQueryError, NotUniqueError)
from mongoengine.queryset import NULLIFY, Q from mongoengine.queryset import NULLIFY, Q
from mongoengine.connection import get_db from mongoengine.connection import get_db
from mongoengine.base import get_document from mongoengine.base import get_document
@ -990,6 +990,16 @@ class InstanceTest(unittest.TestCase):
self.assertRaises(InvalidQueryError, update_no_op_raises) self.assertRaises(InvalidQueryError, update_no_op_raises)
def test_update_unique_field(self):
class Doc(Document):
name = StringField(unique=True)
doc1 = Doc(name="first").save()
doc2 = Doc(name="second").save()
self.assertRaises(NotUniqueError, lambda:
doc2.update(set__name=doc1.name))
def test_embedded_update(self): def test_embedded_update(self):
""" """
Test update on `EmbeddedDocumentField` fields Test update on `EmbeddedDocumentField` fields