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