diff --git a/docs/changelog.rst b/docs/changelog.rst index ec3a5f86..51134238 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.8.7 ================ +- Calling reload on deleted / nonexistant documents raises DoesNotExist (#538) - Stop ensure_indexes running on a secondaries (#555) - Fix circular import issue with django auth (#531) (#545) diff --git a/docs/upgrade.rst b/docs/upgrade.rst index fadda7c6..b55fe312 100644 --- a/docs/upgrade.rst +++ b/docs/upgrade.rst @@ -2,6 +2,12 @@ Upgrading ######### +0.8.7 +***** + +Calling reload on deleted / nonexistant documents now raises a DoesNotExist +exception. + 0.8.2 to 0.8.3 ************** diff --git a/mongoengine/document.py b/mongoengine/document.py index 9a260279..114778eb 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -12,6 +12,7 @@ from mongoengine.common import _import_class from mongoengine.base import (DocumentMetaclass, TopLevelDocumentMetaclass, BaseDocument, BaseDict, BaseList, ALLOW_INHERITANCE, get_document) +from mongoengine.errors import ValidationError from mongoengine.queryset import OperationError, NotUniqueError, QuerySet from mongoengine.connection import get_db, DEFAULT_CONNECTION_NAME from mongoengine.context_managers import switch_db, switch_collection @@ -452,14 +453,16 @@ class Document(BaseDocument): .. versionadded:: 0.1.2 .. versionchanged:: 0.6 Now chainable """ + if not self.pk: + raise self.DoesNotExist("Document does not exist") obj = self._qs.read_preference(ReadPreference.PRIMARY).filter( - **self._object_key).limit(1).select_related(max_depth=max_depth) + **self._object_key).limit(1).select_related(max_depth=max_depth) + if obj: obj = obj[0] else: - msg = "Reloaded document has been deleted" - raise OperationError(msg) + raise self.DoesNotExist("Document does not exist") for field in self._fields_ordered: setattr(self, field, self._reload(field, obj[field])) self._changed_fields = obj._changed_fields diff --git a/tests/document/instance.py b/tests/document/instance.py index 982b1e6c..07db85a0 100644 --- a/tests/document/instance.py +++ b/tests/document/instance.py @@ -409,6 +409,27 @@ class InstanceTest(unittest.TestCase): self.assertEqual(len(doc.embedded_field.list_field), 4) self.assertEqual(len(doc.embedded_field.dict_field), 2) + def test_reload_doesnt_exist(self): + class Foo(Document): + pass + + f = Foo() + try: + f.reload() + except Foo.DoesNotExist: + pass + except Exception as ex: + self.assertFalse("Threw wrong exception") + + f.save() + f.delete() + try: + f.reload() + except Foo.DoesNotExist: + pass + except Exception as ex: + self.assertFalse("Threw wrong exception") + def test_dictionary_access(self): """Ensure that dictionary-style field access works properly. """