From d1add62a0637b839de8038eba0ea57c77c3e80f1 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Wed, 1 Aug 2012 13:11:36 +0100 Subject: [PATCH] More updates --- mongoengine/base.py | 22 ++++++++++++++-------- mongoengine/queryset.py | 15 ++++++++++----- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index 9d342e8c..f8752f36 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -264,7 +264,7 @@ class ComplexBaseField(BaseField): """ field = None - _dereference = False + __dereference = False def __get__(self, instance, owner): """Descriptor to automatically dereference references. @@ -276,8 +276,6 @@ class ComplexBaseField(BaseField): dereference = self.field is None or isinstance(self.field, (GenericReferenceField, ReferenceField)) if not self._dereference and instance._initialised and dereference: - from dereference import DeReference - self._dereference = DeReference() # Cached instance._data[self.name] = self._dereference( instance._data.get(self.name), max_depth=1, instance=instance, name=self.name @@ -293,14 +291,13 @@ class ComplexBaseField(BaseField): value = BaseDict(value, instance, self.name) instance._data[self.name] = value - if self._dereference and instance._initialised and \ - isinstance(value, (BaseList, BaseDict)) and not value._dereferenced: + if (instance._initialised and isinstance(value, (BaseList, BaseDict)) + and not value._dereferenced): value = self._dereference( value, max_depth=1, instance=instance, name=self.name ) value._dereferenced = True instance._data[self.name] = value - return value def __set__(self, instance, value): @@ -441,6 +438,13 @@ class ComplexBaseField(BaseField): owner_document = property(_get_owner_document, _set_owner_document) + @property + def _dereference(self,): + if not self.__dereference: + from dereference import DeReference + self.__dereference = DeReference() # Cached + return self.__dereference + class ObjectIdField(BaseField): """An field wrapper around MongoDB's ObjectIds. @@ -493,8 +497,9 @@ class DocumentMetaclass(type): attrs.update(_get_mixin_fields(p_base)) return attrs - metaclass = attrs.get('__metaclass__') super_new = super(DocumentMetaclass, cls).__new__ + + metaclass = attrs.get('__metaclass__') if metaclass and issubclass(metaclass, DocumentMetaclass): return super_new(cls, name, bases, attrs) @@ -566,7 +571,8 @@ class DocumentMetaclass(type): attrs['_superclasses'] = superclasses if 'Document' not in _module_registry: - from mongoengine import Document, EmbeddedDocument, DictField + from mongoengine.document import Document, EmbeddedDocument + from mongoengine.fields import DictField _module_registry['Document'] = Document _module_registry['EmbeddedDocument'] = EmbeddedDocument _module_registry['DictField'] = DictField diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 0d1d95b7..0e93fd2b 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -329,6 +329,7 @@ class QuerySet(object): """ __already_indexed = set() + __dereference = False def __init__(self, document, collection): self._document = document @@ -600,7 +601,6 @@ class QuerySet(object): if self._hint != -1: self._cursor_obj.hint(self._hint) - return self._cursor_obj @classmethod @@ -1153,8 +1153,7 @@ class QuerySet(object): .. versionadded:: 0.4 .. versionchanged:: 0.5 - Fixed handling references """ - from dereference import DeReference - return DeReference()(self._cursor.distinct(field), 1) + return self._dereference(self._cursor.distinct(field), 1) def only(self, *fields): """Load only a subset of this document's fields. :: @@ -1854,10 +1853,16 @@ class QuerySet(object): .. versionadded:: 0.5 """ - from dereference import DeReference # Make select related work the same for querysets max_depth += 1 - return DeReference()(self, max_depth=max_depth) + return self._dereference(self, max_depth=max_depth) + + @property + def _dereference(self): + if not self.__dereference: + from dereference import DeReference + self.__dereference = DeReference() # Cached + return self.__dereference class QuerySetManager(object):