I am working with mongoengine and trying to do a simple migration. I have a field which I would like to migrate from being a StringField to a ReferenceField to another Object. I planned on doing the migration by hand, first constructing the new object based on the string that comes from the old StringField and then setting it explicitly.
The problem is I cannot even access one of the top level documents anymore once I changed the field type. Is it required to create a "dummy" field in the my document's class code as a placeholder for the new field? This seems kludgy to me so I assume there is a better way?
Here is the error, which is because the field coming out of the DB (StringField) is not consistent with a reference field.
/usr/lib/python2.7/site-packages/mongoengine/queryset/base.pyc in __getitem__(self, key)149 return queryset._get_as_pymongo(queryset._cursor.next())150 return queryset._document._from_son(queryset._cursor[key],
--> 151 _auto_dereference=self._auto_dereference)152 raise AttributeError153 /usr/lib/python2.7/site-packages/mongoengine/base/document.pyc in _from_son(cls, son, _auto_dereference)568 try:569 data[field_name] = (value if value is None
--> 570 else field.to_python(value))571 if field_name != field.db_field:572 del data[field.db_field]/usr/lib/python2.7/site-packages/mongoengine/fields.pyc in to_python(self, value)935 not isinstance(value, (DBRef, Document, EmbeddedDocument))):936 collection = self.document_type._get_collection_name()
--> 937 value = DBRef(collection, self.document_type.id.to_python(value))938 return value939 /usr/lib/python2.7/site-packages/mongoengine/base/fields.pyc in to_python(self, value)390 def to_python(self, value):391 if not isinstance(value, ObjectId):
--> 392 value = ObjectId(value)393 return value394 /usr/lib/python2.7/site-packages/bson/objectid.pyc in __init__(self, oid)88 self.__generate()89 else:
---> 90 self.__validate(oid)91 92 @classmethod/usr/lib/python2.7/site-packages/bson/objectid.pyc in __validate(self, oid)192 raise InvalidId("%s is not a valid ObjectId" % oid)193 else:
--> 194 raise InvalidId("%s is not a valid ObjectId" % oid)195 else:196 raise TypeError("id must be an instance of (%s, %s, ObjectId), "InvalidId: Was Dirty: a2111fe89383bb562738b81c2b63fe78e877ed32 is not a valid ObjectId