diff --git a/mongoengine/dereference.py b/mongoengine/dereference.py index 453ba14f..0f60c2f5 100644 --- a/mongoengine/dereference.py +++ b/mongoengine/dereference.py @@ -220,7 +220,8 @@ class DeReference(object): elif isinstance(v, (dict, SON)) and '_ref' in v: data[k]._data[field_name] = self.object_map.get(v['_ref'].id, v) elif isinstance(v, dict) and depth <= self.max_depth: - data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=name) + item_name = "%s.%s.%s" % (name, k, field_name) + data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=item_name) elif isinstance(v, (list, tuple)) and depth <= self.max_depth: data[k]._data[field_name] = self._attach_objects(v, depth, instance=instance, name=name) elif isinstance(v, (dict, list, tuple)) and depth <= self.max_depth: diff --git a/tests/document/delta.py b/tests/document/delta.py index 7ec6ee56..95a03861 100644 --- a/tests/document/delta.py +++ b/tests/document/delta.py @@ -827,5 +827,29 @@ class DeltaTest(unittest.TestCase): org2.reload() self.assertEqual(org2.name, 'New Org 2') + def test_delta_for_nested_map_fields(self): + class EmbeddedRole(EmbeddedDocument): + type = StringField() + + class EmbeddedUser(EmbeddedDocument): + name = StringField() + roles = MapField(field=EmbeddedDocumentField(EmbeddedRole)) + + class Doc(Document): + users = MapField(field=EmbeddedDocumentField(EmbeddedUser)) + num = IntField(default=-1) + + Doc.drop_collection() + + doc = Doc(num=1) + doc.users["007"] = EmbeddedUser(name="Agent007") + doc.save() + + d = Doc.objects(num=1).first() + d.users["007"]["roles"]["666"] = EmbeddedRole(type="superadmin") + delta = d._delta() + self.assertEqual(True, "users.007.roles.666" in delta[0]) + self.assertEqual('superadmin', delta[0]["users.007.roles.666"]["type"]) + if __name__ == '__main__': unittest.main()