ITADN

MongoEngine filters use a mongoengine.fields object instead of a string

#2700Opencgoina 创建于 2025-11-05
mongo-engine
C
cgoinacommented
When filtering based on a string value flask admin generates an error with the following trace: ``` 127.0.0.1 - - [05/Nov/2025 15:50:28] "GET /admin/parameter/?flt0_0=z1stitchingParseMetadata HTTP/1.1" 500 - Traceback (most recent call last): File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/transform.py", line 104, in query fields = _doc_cls._lookup_field(parts) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/base/document.py", line 1140, in _lookup_field raise LookUpError('Cannot resolve field "%s"' % field_name) mongoengine.errors.LookUpError: Cannot resolve field "<mongoengine.fields.StringField object at 0x107780b90>" During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask/app.py", line 1536, in __call__ return self.wsgi_app(environ, start_response) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask/app.py", line 1514, in wsgi_app response = self.handle_exception(e) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask/app.py", line 1511, in wsgi_app response = self.full_dispatch_request() File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask/app.py", line 919, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask/app.py", line 917, in full_dispatch_request rv = self.dispatch_request() File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask_debugtoolbar/__init__.py", line 222, in dispatch_request return view_func(**view_args) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask_admin/base.py", line 89, in inner return self._run_view(current_app.ensure_sync(f), *args, **kwargs) ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask_admin/base.py", line 435, in _run_view return fn(self, *args, **kwargs) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask_admin/model/base.py", line 2215, in index_view count, data = self.get_list( File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/flask_admin/contrib/mongoengine/view.py", line 567, in get_list count = query.count() if not self.simple_list_pager else None ~~~~~~~~~~~^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/queryset.py", line 143, in count return super().count(with_limit_and_skip) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/base.py", line 432, in count collection=self._cursor.collection, ^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/base.py", line 1720, in _cursor self._cursor_obj = self._collection.find(self._query, **self._cursor_args) ^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/base.py", line 1769, in _query self._mongo_query = self._query_obj.to_query(self._document) ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/visitor.py", line 91, in to_query query = query.accept(QueryCompilerVisitor(document)) File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/visitor.py", line 184, in accept return visitor.visit_query(self) ~~~~~~~~~~~~~~~~~~~^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/visitor.py", line 80, in visit_query return transform.query(self.document, **query.query) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/goinac/Work/HHMI/JACS/jacs-ipp/.venv/lib/python3.14/site-packages/mongoengine/queryset/transform.py", line 106, in query raise InvalidQueryError(e) mongoengine.errors.InvalidQueryError: Cannot resolve field "<mongoengine.fields.StringField object at 0x107780b90>" ``` You can see that it is passing a StringField to the filter instead of a string. The filter expects the column to be a string not an object. I fixed it by patching the FilterConverter this method: ``` from flask_admin.contrib.mongoengine import filters as mongo_filters # Currently the convert method takes a field object as column not a string as field name. # This patch addresses the problem def _patched_convert(self, type_name, column, name): filter_name = type_name.lower() if filter_name in self.converters: if isinstance(column, str): return self.converters[filter_name](column, name) else: return self.converters[filter_name](column.name, name) return None mongo_filters.FilterConverter.convert = _patched_convert ``` Environment: - Python version: 3.13, 3.14 - Flask version: 3.1.2 - Flask-Admin version: 2.0.1
4 条评论