diff --git a/docs/changelog.rst b/docs/changelog.rst index 638c0e80..1504b08c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,10 @@ Changelog ========= +Changes in 0.7.X +================ +- Fixed reload issue with ReferenceField where dbref=False (MongoEngine/mongoengine#138) + Changes in 0.7.5 ================ - ReferenceFields with dbref=False use ObjectId instead of strings (MongoEngine/mongoengine#134) diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index d3711876..386dbf4b 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -31,10 +31,10 @@ class DeReference(object): items = [i for i in items] self.max_depth = max_depth - doc_type = None + if instance and instance._fields: - doc_type = instance._fields[name] + doc_type = instance._fields.get(name) if hasattr(doc_type, 'field'): doc_type = doc_type.field @@ -134,7 +134,7 @@ class DeReference(object): elif doc_type is None: doc = get_document( ''.join(x.capitalize() - for x in col.split('_')))._from_son(ref) + for x in col.split('_')))._from_son(ref) else: doc = doc_type._from_son(ref) object_map[doc.id] = doc @@ -166,7 +166,7 @@ class DeReference(object): return self.object_map.get(items['_ref'].id, items) elif '_types' in items and '_cls' in items: doc = get_document(items['_cls'])._from_son(items) - doc._data = self._attach_objects(doc._data, depth, doc, name) + doc._data = self._attach_objects(doc._data, depth, doc, None) return doc if not hasattr(items, 'items'): diff --git a/mongoengine/document.py b/mongoengine/document.py index 23009dbb..7b3afafb 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -361,7 +361,12 @@ class Document(BaseDocument): id_field = self._meta['id_field'] obj = self.__class__.objects( **{id_field: self[id_field]} - ).first().select_related(max_depth=max_depth) + ).limit(1).select_related(max_depth=max_depth) + if obj: + obj = obj[0] + else: + msg = "Reloaded document has been deleted" + raise OperationError(msg) for field in self._fields: setattr(self, field, self._reload(field, obj[field])) if self._dynamic: diff --git a/tests/test_dereference.py b/tests/test_dereference.py index 0d757fd7..7b149dbd 100644 --- a/tests/test_dereference.py +++ b/tests/test_dereference.py @@ -84,6 +84,7 @@ class FieldTest(unittest.TestCase): group = Group(members=User.objects) group.save() + group.reload() # Confirm reload works with query_counter() as q: self.assertEqual(q, 0)