potential fix for dereferencing nested lists
This commit is contained in:
		| @@ -35,7 +35,7 @@ class DeReference(object): | |||||||
|  |  | ||||||
|         if instance and isinstance(instance, (Document, TopLevelDocumentMetaclass)): |         if instance and isinstance(instance, (Document, TopLevelDocumentMetaclass)): | ||||||
|             doc_type = instance._fields.get(name) |             doc_type = instance._fields.get(name) | ||||||
|             if hasattr(doc_type, 'field'): |             while hasattr(doc_type, 'field'): | ||||||
|                 doc_type = doc_type.field |                 doc_type = doc_type.field | ||||||
|  |  | ||||||
|             if isinstance(doc_type, ReferenceField): |             if isinstance(doc_type, ReferenceField): | ||||||
| @@ -50,9 +50,19 @@ class DeReference(object): | |||||||
|                     return items |                     return items | ||||||
|                 elif not field.dbref: |                 elif not field.dbref: | ||||||
|                     if not hasattr(items, 'items'): |                     if not hasattr(items, 'items'): | ||||||
|                         items = [field.to_python(v) |  | ||||||
|                              if not isinstance(v, (DBRef, Document)) else v |                         def _get_items(items): | ||||||
|                              for v in 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: |                     else: | ||||||
|                         items = dict([ |                         items = dict([ | ||||||
|                             (k, field.to_python(v)) |                             (k, field.to_python(v)) | ||||||
| @@ -113,11 +123,11 @@ class DeReference(object): | |||||||
|         """Fetch all references and convert to their document objects |         """Fetch all references and convert to their document objects | ||||||
|         """ |         """ | ||||||
|         object_map = {} |         object_map = {} | ||||||
|         for col, dbrefs in self.reference_map.iteritems(): |         for collection, dbrefs in self.reference_map.iteritems(): | ||||||
|             keys = object_map.keys() |             keys = object_map.keys() | ||||||
|             refs = list(set([dbref for dbref in dbrefs if unicode(dbref).encode('utf-8') not in 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 |             if hasattr(collection, 'objects'):  # We have a document class for the refs | ||||||
|                 references = col.objects.in_bulk(refs) |                 references = collection.objects.in_bulk(refs) | ||||||
|                 for key, doc in references.iteritems(): |                 for key, doc in references.iteritems(): | ||||||
|                     object_map[key] = doc |                     object_map[key] = doc | ||||||
|             else:  # Generic reference: use the refs data to convert to document |             else:  # Generic reference: use the refs data to convert to document | ||||||
| @@ -125,19 +135,19 @@ class DeReference(object): | |||||||
|                     continue |                     continue | ||||||
|  |  | ||||||
|                 if doc_type: |                 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: |                     for ref in references: | ||||||
|                         doc = doc_type._from_son(ref) |                         doc = doc_type._from_son(ref) | ||||||
|                         object_map[doc.id] = doc |                         object_map[doc.id] = doc | ||||||
|                 else: |                 else: | ||||||
|                     references = get_db()[col].find({'_id': {'$in': refs}}) |                     references = get_db()[collection].find({'_id': {'$in': refs}}) | ||||||
|                     for ref in references: |                     for ref in references: | ||||||
|                         if '_cls' in ref: |                         if '_cls' in ref: | ||||||
|                             doc = get_document(ref["_cls"])._from_son(ref) |                             doc = get_document(ref["_cls"])._from_son(ref) | ||||||
|                         elif doc_type is None: |                         elif doc_type is None: | ||||||
|                             doc = get_document( |                             doc = get_document( | ||||||
|                                 ''.join(x.capitalize() |                                 ''.join(x.capitalize() | ||||||
|                                     for x in col.split('_')))._from_son(ref) |                                     for x in collection.split('_')))._from_son(ref) | ||||||
|                         else: |                         else: | ||||||
|                             doc = doc_type._from_son(ref) |                             doc = doc_type._from_son(ref) | ||||||
|                         object_map[doc.id] = doc |                         object_map[doc.id] = doc | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user