My problem matches this post on Bountysource:
My work place has used PyMongo 2.6.3/MongoEngine 0.8.7 for a while, and we are considering upgrading to PyMongo 3.2.2/MongoEngine 0.10.6. I downloaded those versions and started testing them. I began running into issues with a class that was based on DynamicDocuments that used DictFields.
14:20:20 ERROR nas.data.sync Traceback (most recent call last):
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/nas/data/sync.py", line 1484, in main
14:20:20 ERROR nas.data.sync result = funct(external, syncRecord)
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/nas/data/sync.py", line 456, in syncAsset
14:20:20 ERROR nas.data.sync success = scheduleUpdate(asset, v) and success
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/nas/data/sync.py", line 299, in scheduleUpdate
14:20:20 ERROR nas.data.sync for wu in workunits:
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/queryset.py", line 80, in _iter_results
14:20:20 ERROR nas.data.sync self._populate_cache()
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/queryset.py", line 92, in _populate_cache
14:20:20 ERROR nas.data.sync self._result_cache.append(self.next())
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/base.py", line 1407, in next
14:20:20 ERROR nas.data.sync raw_doc = self._cursor.next()
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/base.py", line 1481, in _cursor
14:20:20 ERROR nas.data.sync self._cursor_obj = self._collection.find(self._query,
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/base.py", line 1515, in _query
14:20:20 ERROR nas.data.sync self._mongo_query = self._query_obj.to_query(self._document)
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/visitor.py", line 90, in to_query
14:20:20 ERROR nas.data.sync query = query.accept(QueryCompilerVisitor(document))
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/visitor.py", line 155, in accept
14:20:20 ERROR nas.data.sync return visitor.visit_query(self)
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/visitor.py", line 78, in visit_query
14:20:20 ERROR nas.data.sync return transform.query(self.document, **query.query)
14:20:20 ERROR nas.data.sync File "E:/alpha_maya_pyside/auxiliary/__all/MongoEngine-0.10.6/mongoengine/queryset/transform.py", line 61, in query
14:20:20 ERROR nas.data.sync raise InvalidQueryError(e)
14:20:20 ERROR nas.data.sync InvalidQueryError: 'DictField' object has no attribute 'document_type'
14:20:20 ERROR nas.data.sync sync failed
Having the class inherit from Document instead of DynamicDocument did fix the issue. I have been digging into the MongoEngine source code, but nothing really jumps out at me. My only guess is that MongoEngine might be having trouble converting a DynamicField into a DictField.
I added a print statement MongoEngine-0.10.6/mongoengine/queryset/transform.py:
try:
fields = _doc_cls._lookup_field(parts)
print fields
except Exception, e:
raise InvalidQueryError(e)
I got this output just before the error message:
[<mongoengine.fields.DynamicField object at 0x00000000048B48D0>]