Skip to content

Filtering with AND with same key and a regex value causes: TypeError: '_sre.SRE_Pattern' object is not iterable" #1286

@jkauppila

Description

@jkauppila

Hi all,
The problem should be replicatable with any model like this:
Model.objects.filter(Q((value__startswith="test")&Q(value__not__startswith="test2"))

Here's the total traceback

File "<console>", line 1, in <module>
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/queryset.py", line 58, in __repr__
                    self._populate_cache()
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/queryset.py", line 92, in _populate_cache
                    self._result_cache.append(self.next())
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 1416, in next
                    raw_doc = self._cursor.next()
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 1490, in _cursor
                    self._cursor_obj = self._collection.find(self._query,
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/base.py", line 1524, in _query
                    self._mongo_query = self._query_obj.to_query(self._document)
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/visitor.py", line 90, in to_query
                    query = query.accept(QueryCompilerVisitor(document))
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/visitor.py", line 155, in accept
                    return visitor.visit_query(self)
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/visitor.py", line 78, in visit_query
                    return transform.query(self.document, **query.query)
                  File "/Users/jussi/src/project/env/lib/python2.7/site-packages/mongoengine/queryset/transform.py", line 136, in query
                    mongo_query[key].update(value)
                TypeError: '_sre.SRE_Pattern' object is not iterable

Here is the my proposed fix:

diff --git a/mongoengine/queryset/transform.py b/mongoengine/queryset/transform.py
index 13302af..c5d4c1f 100644
--- a/mongoengine/queryset/transform.py
+++ b/mongoengine/queryset/transform.py
@@ -1,6 +1,7 @@
 from collections import defaultdict

 import pymongo
+import re
 from bson import SON

 from mongoengine.base.fields import UPDATE_OPERATORS
@@ -129,7 +130,8 @@ def query(_doc_cls=None, **kwargs):
         if op is None or key not in mongo_query:
             mongo_query[key] = value
         elif key in mongo_query:
-            if key in mongo_query and isinstance(mongo_query[key], dict):
+            if key in mongo_query and isinstance(mongo_query[key], dict) and \
+                    (not isinstance(value, re._pattern_type)):
                 mongo_query[key].update(value)
                 # $max/minDistance needs to come last - convert to SON
                 value_dict = mongo_query[key]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions