From 9a8b3e3e25004d138d3ca33e472ae04226c72daf Mon Sep 17 00:00:00 2001 From: Thomas Steinacher Date: Fri, 19 Jun 2020 14:40:16 -0400 Subject: [PATCH] Meaningful reference errors --- mongoengine/base/fields.py | 4 ++++ mongoengine/base/proxy.py | 26 ++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index c1ad6c0ad..2a15ffcc4 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -10,6 +10,7 @@ from mongoengine.base.common import ALLOW_INHERITANCE from mongoengine.base.datastructures import BaseDict, BaseList +from mongoengine.base.proxy import DocumentProxy __all__ = ("BaseField", "ComplexBaseField", "ObjectIdField", "GeoJsonBaseField") @@ -103,9 +104,12 @@ def __get__(self, instance, owner): value = self.default() if callable(self.default) else self.default else: value = self.to_python(db_value) + if isinstance(value, DocumentProxy): + value._set_parent_ref(instance, name) if hasattr(self, 'value_for_instance'): value = self.value_for_instance(value, instance) + data[name] = value return data[name] diff --git a/mongoengine/base/proxy.py b/mongoengine/base/proxy.py index 01d206fac..498de3ba0 100644 --- a/mongoengine/base/proxy.py +++ b/mongoengine/base/proxy.py @@ -124,7 +124,19 @@ def __delslice__(self, i, j): class DocumentProxy(LocalProxy): - __slots__ = ('__document_type', '__document', '__pk') + __slots__ = ( + '__document_type', + '__document', + '__pk', + '__parent_ref_instance', + '__parent_ref_field_name', + ) + + def _set_parent_ref(self, instance, field_name): + object.__setattr__(self, '_DocumentProxy__parent_ref_instance', + instance) + object.__setattr__(self, '_DocumentProxy__parent_ref_field_name', + field_name) def __init__(self, document_type, pk): object.__setattr__(self, '_DocumentProxy__document_type', document_type) @@ -186,7 +198,17 @@ def _get_current_object(self): collection = self.__document_type._get_collection() son = collection.find_one({'_id': self.__pk}) if son is None: - raise DoesNotExist('Document has been deleted.') + error = 'Document ({} {}'.format( + collection.name, self.__pk + ) + if self.__parent_ref_instance: + error += ', referenced by {} {} in field {}'.format( + self.__parent_ref_instance.__class__.__name__, + self.__parent_ref_instance.pk, + self.__parent_ref_field_name, + ) + error += ') has been deleted.' + raise DoesNotExist(error) document = self.__document_type._from_son(son) object.__setattr__(self, '_DocumentProxy__document', document) return self.__document