potential fix for dereferencing nested lists
This commit is contained in:
parent
e0dd33e6be
commit
a7ca9950fc
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user