Skip to content

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

@cgoina

Description

@cgoina

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions