diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index e5e8886b..d822e430 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -35,7 +35,7 @@ class DeReference(object): if instance and isinstance(instance, (Document, TopLevelDocumentMetaclass)): doc_type = instance._fields.get(name) - if hasattr(doc_type, 'field'): + while hasattr(doc_type, 'field'): doc_type = doc_type.field if isinstance(doc_type, ReferenceField): @@ -50,9 +50,19 @@ class DeReference(object): return items elif not field.dbref: if not hasattr(items, 'items'): - items = [field.to_python(v) - if not isinstance(v, (DBRef, Document)) else v - for v in items] + + def _get_items(items): + new_items = [] + for v in items: + if isinstance(v, list): + new_items.append(_get_items(v)) + elif not isinstance(v, (DBRef, Document)): + new_items.append(field.to_python(v)) + else: + new_items.append(v) + return new_items + + items = _get_items(items) else: items = dict([ (k, field.to_python(v)) @@ -113,11 +123,11 @@ class DeReference(object): """Fetch all references and convert to their document objects """ object_map = {} - for col, dbrefs in self.reference_map.iteritems(): + for collection, dbrefs in self.reference_map.iteritems(): keys = object_map.keys() refs = list(set([dbref for dbref in dbrefs if unicode(dbref).encode('utf-8') not in keys])) - if hasattr(col, 'objects'): # We have a document class for the refs - references = col.objects.in_bulk(refs) + if hasattr(collection, 'objects'): # We have a document class for the refs + references = collection.objects.in_bulk(refs) for key, doc in references.iteritems(): object_map[key] = doc else: # Generic reference: use the refs data to convert to document @@ -125,19 +135,19 @@ class DeReference(object): continue if doc_type: - references = doc_type._get_db()[col].find({'_id': {'$in': refs}}) + references = doc_type._get_db()[collection].find({'_id': {'$in': refs}}) for ref in references: doc = doc_type._from_son(ref) object_map[doc.id] = doc else: - references = get_db()[col].find({'_id': {'$in': refs}}) + references = get_db()[collection].find({'_id': {'$in': refs}}) for ref in references: if '_cls' in ref: doc = get_document(ref["_cls"])._from_son(ref) elif doc_type is None: doc = get_document( ''.join(x.capitalize() - for x in col.split('_')))._from_son(ref) + for x in collection.split('_')))._from_son(ref) else: doc = doc_type._from_son(ref) object_map[doc.id] = doc