diff --git a/mongoengine/base.py b/mongoengine/base.py index 369c10f3..3190de6f 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -339,7 +339,7 @@ class ComplexBaseField(BaseField): # _types / _cls data so make it a generic reference allows # us to dereference meta = getattr(v, 'meta', getattr(v, '_meta', {})) - if meta and not meta['allow_inheritance'] and not self.field: + if meta and not meta.get('allow_inheritance', True) and not self.field: from fields import GenericReferenceField value_dict[k] = GenericReferenceField().to_mongo(v) else: diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index 40ceb49c..ac01ac71 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -1,7 +1,7 @@ import pymongo from base import (BaseDict, BaseList, TopLevelDocumentMetaclass, get_document) -from fields import ReferenceField +from fields import (ReferenceField, ListField, DictField, MapField) from connection import get_db from queryset import QuerySet from document import Document @@ -102,7 +102,7 @@ class DeReference(object): for key, doc in references.iteritems(): object_map[key] = doc else: # Generic reference: use the refs data to convert to document - if doc_type: + if doc_type and not isinstance(doc_type, (ListField, DictField, MapField,) ): references = doc_type._get_db()[col].find({'_id': {'$in': refs}}) for ref in references: doc = doc_type._from_son(ref) diff --git a/tests/dereference.py b/tests/dereference.py index 88cf17ee..a23d78f2 100644 --- a/tests/dereference.py +++ b/tests/dereference.py @@ -783,3 +783,41 @@ class FieldTest(unittest.TestCase): root = root.reload() self.assertEquals(root.children, [company]) self.assertEquals(company.parents, [root]) + + def test_dict_in_dbref_instance(self): + + class Person(Document): + name = StringField(max_length=250, required=True) + + meta = { "ordering" : "name" } + + class Room(Document): + number = StringField(max_length=250, required=True) + staffs_with_position = ListField(DictField()) + + meta = { "ordering" : "number" } + + + + Person.drop_collection() + + # 201 + bob = Person.objects.create(name='Bob') + bob.save() + keven = Person.objects.create(name='Keven') + keven.save() + sarah = Person.objects.create(name='Sarah') + sarah.save() + + room_201 = Room.objects.create( number = "201") + room_201.staffs_with_position = [ {'position_key': 'window', 'staff' : sarah.to_dbref() }, + { 'position_key': 'door', 'staff': bob.to_dbref() }, + { 'position_key': 'center' , 'staff' : keven.to_dbref() } ] + room_201.save() + + room = Room.objects.first().select_related() + room.to_mongo() + + + +