在 pymongo 中是否可以让该collection.find()
方法返回一个从基类继承的自定义游标类,但重新定义迭代的发生方式?
我想在迭代时从光标内的 mongo 数据实例化应用程序特定模型。文档有一个type
属性,它将确定应该创建什么样的实例。我在想该next
方法可以查看这些数据并决定创建和返回哪种类型。从光标继承很容易,但我不知道在哪里将它挂钩到find()
操作中?
编辑或者...
我目前正在做的是用来yield
吐出一个生成器,该生成器将在执行获取之后对对象进行分类。
@classmethod
def gather(cls,place_id):
"""
Gather instances of all the shouts for one place
"""
shouts = cls.collection.find({'place_id':place_id})
for s in shouts:
yield Shout.classify(s)
@classmethod
def classify(cls,shout):
if shout.type == 1:
return Type1(dict(shout))
elif shout.type == 2:
return Type2(dict(shout))
elif shout.type == 3:
return Type3(dict(shout))
问题是这并没有保留封装在默认 pymongo 中的括号键访问的原始方法Cursor
。
如果我要创建一个仅接受游标实例并包装其方法的包装类,我需要重写哪些魔术方法以保留原始游标的迭代行为?我在想这样的事情:
class StuffCursor():
cursor = False
def __init__(self,cursor):
self.cursor = cursor
def __getattr__(self,attr):
#This passes off most key-based calls, like bracket-access, to the cursor
return getattr(self.cursor,attr)
这正是我能想到的,但是任何可以在迭代器之上堆叠一些额外处理,然后返回修改后的迭代器的东西都可以。