Допустим, у меня есть класс: TestClass
. Этот класс имеет слоты.
class TestClass(object):
__slots__ = ('_id', 'value1', 'value2',)
Итак, мы создаем объект.
test = TestClass()
test.key1 = 'val1'
test.key2 = 'val2'
Отлично! Теперь я хотел бы вставить test
в экземпляр MongoDB.
db.test_collection.insert(test)
Э-э-э.
TypeError: 'TestClass' object is not iterable
Хорошо, давайте сделаем это итеративно.
class TestClass(object):
__slots__ = ('_id', 'key1', 'key2',)
def __iter__(self):
yield from dict(
(slot, self.__getattribute__(slot))
for slot in self.__slots__).items()
test = TestClass()
test.key1 = 'val1'
test.key2 = 'val2'
for i in test:
print(i)
// result
// ('key1', 'val1')
// ('key2', 'val2')
db.test_collection.insert(test)
Это дает мне: doc['_id'] = ObjectId() // TypeError: 'tuple' object does not support item assignment
.
Далее, скажем, у меня есть композиция объектов ...
test = TestClass()
test.key1 = 'val1'
test.key2 = TestClass()
Может ли кодировщик pymongo кодировать test.key2
при сохранении test
?
РЕДАКТИРОВАТЬ: Хорошо, я не сохраняю объект напрямую и не вызываю функцию на объекте, такую как test.to_document()
, но цель состоит в том, чтобы составные поля (например, test.key2
) стали диктовкой, так что что это может быть сохранено.