-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Open
Labels
Description
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