Возможно ли в pymongo, чтобы метод collection.find() возвращал пользовательский класс курсора, который наследуется от базы, но переопределяет, как происходит итерация?
Я хотел бы создать экземпляр конкретных моделей приложения из данных монго внутри курсора прямо во время итерации. Документы имеют атрибут 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)
Это только то, что я мог придумать, но все, что накладывало бы некоторую дополнительную обработку поверх итератора, а затем возвращало измененный итератор, работало бы.