More updates

This commit is contained in:
Ross Lawley 2012-08-01 13:11:36 +01:00
parent c419f3379a
commit d1add62a06
2 changed files with 24 additions and 13 deletions

View File

@ -264,7 +264,7 @@ class ComplexBaseField(BaseField):
""" """
field = None field = None
_dereference = False __dereference = False
def __get__(self, instance, owner): def __get__(self, instance, owner):
"""Descriptor to automatically dereference references. """Descriptor to automatically dereference references.
@ -276,8 +276,6 @@ class ComplexBaseField(BaseField):
dereference = self.field is None or isinstance(self.field, dereference = self.field is None or isinstance(self.field,
(GenericReferenceField, ReferenceField)) (GenericReferenceField, ReferenceField))
if not self._dereference and instance._initialised and dereference: 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[self.name] = self._dereference(
instance._data.get(self.name), max_depth=1, instance=instance, instance._data.get(self.name), max_depth=1, instance=instance,
name=self.name name=self.name
@ -293,14 +291,13 @@ class ComplexBaseField(BaseField):
value = BaseDict(value, instance, self.name) value = BaseDict(value, instance, self.name)
instance._data[self.name] = value instance._data[self.name] = value
if self._dereference and instance._initialised and \ if (instance._initialised and isinstance(value, (BaseList, BaseDict))
isinstance(value, (BaseList, BaseDict)) and not value._dereferenced: and not value._dereferenced):
value = self._dereference( value = self._dereference(
value, max_depth=1, instance=instance, name=self.name value, max_depth=1, instance=instance, name=self.name
) )
value._dereferenced = True value._dereferenced = True
instance._data[self.name] = value instance._data[self.name] = value
return value return value
def __set__(self, instance, value): def __set__(self, instance, value):
@ -441,6 +438,13 @@ class ComplexBaseField(BaseField):
owner_document = property(_get_owner_document, _set_owner_document) 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): class ObjectIdField(BaseField):
"""An field wrapper around MongoDB's ObjectIds. """An field wrapper around MongoDB's ObjectIds.
@ -493,8 +497,9 @@ class DocumentMetaclass(type):
attrs.update(_get_mixin_fields(p_base)) attrs.update(_get_mixin_fields(p_base))
return attrs return attrs
metaclass = attrs.get('__metaclass__')
super_new = super(DocumentMetaclass, cls).__new__ super_new = super(DocumentMetaclass, cls).__new__
metaclass = attrs.get('__metaclass__')
if metaclass and issubclass(metaclass, DocumentMetaclass): if metaclass and issubclass(metaclass, DocumentMetaclass):
return super_new(cls, name, bases, attrs) return super_new(cls, name, bases, attrs)
@ -566,7 +571,8 @@ class DocumentMetaclass(type):
attrs['_superclasses'] = superclasses attrs['_superclasses'] = superclasses
if 'Document' not in _module_registry: 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['Document'] = Document
_module_registry['EmbeddedDocument'] = EmbeddedDocument _module_registry['EmbeddedDocument'] = EmbeddedDocument
_module_registry['DictField'] = DictField _module_registry['DictField'] = DictField

View File

@ -329,6 +329,7 @@ class QuerySet(object):
""" """
__already_indexed = set() __already_indexed = set()
__dereference = False
def __init__(self, document, collection): def __init__(self, document, collection):
self._document = document self._document = document
@ -600,7 +601,6 @@ class QuerySet(object):
if self._hint != -1: if self._hint != -1:
self._cursor_obj.hint(self._hint) self._cursor_obj.hint(self._hint)
return self._cursor_obj return self._cursor_obj
@classmethod @classmethod
@ -1153,8 +1153,7 @@ class QuerySet(object):
.. versionadded:: 0.4 .. versionadded:: 0.4
.. versionchanged:: 0.5 - Fixed handling references .. versionchanged:: 0.5 - Fixed handling references
""" """
from dereference import DeReference return self._dereference(self._cursor.distinct(field), 1)
return DeReference()(self._cursor.distinct(field), 1)
def only(self, *fields): def only(self, *fields):
"""Load only a subset of this document's fields. :: """Load only a subset of this document's fields. ::
@ -1854,10 +1853,16 @@ class QuerySet(object):
.. versionadded:: 0.5 .. versionadded:: 0.5
""" """
from dereference import DeReference
# Make select related work the same for querysets # Make select related work the same for querysets
max_depth += 1 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): class QuerySetManager(object):