Added no_dereference method for querysets (#82) (#61)

This commit is contained in:
Ross Lawley
2013-01-24 17:33:10 +00:00
parent ed2ea24b75
commit ba48dfb4bf
8 changed files with 61 additions and 22 deletions

View File

@@ -1,3 +1,4 @@
import copy
import operator
from functools import partial
@@ -461,9 +462,10 @@ class BaseDocument(object):
return cls._meta.get('collection', None)
@classmethod
def _from_son(cls, son):
def _from_son(cls, son, _auto_dereference=True):
"""Create an instance of a Document (subclass) from a PyMongo SON.
"""
# get the class name from the document, falling back to the given
# class if unavailable
class_name = son.get('_cls', cls._class_name)
@@ -480,7 +482,12 @@ class BaseDocument(object):
changed_fields = []
errors_dict = {}
for field_name, field in cls._fields.iteritems():
fields = cls._fields
if not _auto_dereference:
fields = copy.copy(fields)
for field_name, field in fields.iteritems():
field._auto_dereference = _auto_dereference
if field.db_field in data:
value = data[field.db_field]
try:
@@ -507,6 +514,8 @@ class BaseDocument(object):
obj = cls(__auto_convert=False, **data)
obj._changed_fields = changed_fields
obj._created = False
if not _auto_dereference:
obj._fields = fields
return obj
@classmethod

View File

@@ -168,6 +168,7 @@ class ComplexBaseField(BaseField):
(self.field is None or isinstance(self.field,
(GenericReferenceField, ReferenceField))))
self._auto_dereference = instance._fields[self.name]._auto_dereference
if not self.__dereference and instance._initialised and dereference:
instance._data[self.name] = self._dereference(
instance._data.get(self.name), max_depth=1, instance=instance,