Ani*_*ish 2 python regex deep-copy mongoengine
我在使用list和regex查询查询mongodb模型(Python/MongoEngine)时遇到异常.代码是
from mongoengine import *
import re
db = connect('testdb')
class Team(Document):
name = StringField()
groups = ListField(ReferenceField('Group'))
class Group(Document):
name = StringField()
Team.drop_collection()
Group.drop_collection()
g1 = Group('G1')
g1.save()
g2 = Group('G2')
g2.save()
g3 = Group('G3')
g3.save()
g4 = Group('G4')
g4.save()
t = Team('Team1',[g1,g2,g3])
t.save()
t = Team('Team2',[g1,g2,g4])
t.save()
t = Team('Team3',[])
t.save()
t = Team('Team3',[g3,g2])
t.save()
t = Team('Team3',[g4,g1])
t.save()
# TypeError: cannot deepcopy this pattern object
teams = Team.objects( Q(groups__in=[g3,g2]) & Q(name=re.compile('eam3')))
for team in teams:
print team.name
#-------------------------
Run Code Online (Sandbox Code Playgroud)
异常回溯是
Traceback (most recent call last):
File "so_mongoengine_query.py", line 46, in <module>
for team in teams:
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/queryset.py", line 81, in _iter_results
self._populate_cache()
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/queryset.py", line 93, in _populate_cache
self._result_cache.append(self.next())
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/base.py", line 1137, in next
raw_doc = self._cursor.next()
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/base.py", line 1182, in _cursor
self._cursor_obj = self._collection.find(self._query,
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/base.py", line 1215, in _query
self._mongo_query = self._query_obj.to_query(self._document)
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/visitor.py", line 91, in to_query
query = self.accept(SimplificationVisitor())
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/visitor.py", line 141, in accept
return visitor.visit_combination(self)
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/visitor.py", line 41, in visit_combination
return Q(**self._query_conjunction(queries))
File "/usr/local/lib/python2.7/dist-packages/mongoengine/queryset/visitor.py", line 61, in _query_conjunction
combined_query.update(copy.deepcopy(query))
File "/usr/lib/python2.7/copy.py", line 163, in deepcopy
y = copier(x, memo)
File "/usr/lib/python2.7/copy.py", line 257, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/usr/lib/python2.7/copy.py", line 174, in deepcopy
y = copier(memo)
TypeError: cannot deepcopy this pattern object
Run Code Online (Sandbox Code Playgroud)
Update-1:以下代码生成相同的异常
query = ( Q(groups__in=[g3,g2]) & Q(name=re.compile('eam3')))
copy.deepcopy(query)
Run Code Online (Sandbox Code Playgroud)
有什么建议 ?谢谢
因为Python中不支持编译的正则表达式模式的深度复制(因为Python 2.5),即,
copy.deepcopy(re.compile('eam3'))
Run Code Online (Sandbox Code Playgroud)
不受支持.当组合多个查询对象时,mongoengine将使用copy.deepcopy.因此,如果您使用单个正则表达式过滤器,则使用mongoengine可以查询,但不能使用倍数.
mongoengine支持一组字符串查询,您可以在文档中找到它们.
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |