Pymongo: анализ | сериализация запроса вывода коллекции

StackOverflow https://stackoverflow.com/questions/7821265

  •  27-10-2019
  •  | 
  •  

Вопрос

По умолчанию collection.find или же collection.findone() Функции приводят к типам словаря, и если вы передаете Paramater as_class=SomeUserClass чем он попытается проанализировать результат в этот формат класса. но кажется, что этот класс также должен быть получен класс словаря (как это требовалось __setitem__ Функция для определения, и я могу добавить ключи в класс). Здесь я хочу установить свойства класса. Как я могу добиться этого? Кроме того, мой класс коллекции содержит некоторые детские классы в качестве свойств. Так как я могу установить свойства детских классов.

Это было полезно?

Решение 2

Я решил это, добавив __setitem__ в классе. чем я делаю

result = as_class()
for key,value in dict_expr.items():
        result.__setitem__(key,value)

И в моем классе __setitem__ как

def __setitem__(self,key,value):
     try:
        attr = getattr(class_obj,key)
        if(attr!=None):
            if(isinstance(value,dict)):
                for child_key,child_value in value.items(): 
                    attr.__setitem__(child_key,child_value)
                setattr(class_obj,key,attr)
            else:
                setattr(class_obj,key,value)

    except AttributeError:
       pass

Другие советы

Похоже, вы хотите что-то вроде объектно-реляционного картера. Я основной автор одного Мин , но есть и несколько других для Python. В Ming вы можете сделать следующее, чтобы настроить картирование:

from ming import schema, Field
from ming.orm import (mapper, Mapper, RelationProperty, 
    ForeignIdProperty)

WikiDoc = collection(‘wiki_page', session,
    Field('_id', schema.ObjectId()),
    Field('title', str, index=True),
    Field('text', str))
CommentDoc = collection(‘comment', session,
    Field('_id', schema.ObjectId()),
    Field('page_id', schema.ObjectId(), index=True),
    Field('text', str))

class WikiPage(object): pass
class Comment(object): pass

ormsession.mapper(WikiPage, WikiDoc, properties=dict(
    comments=RelationProperty('WikiComment')))
ormsession.mapper(Comment, CommentDoc, properties=dict(
    page_id=ForeignIdProperty('WikiPage'),
    page=RelationProperty('WikiPage')))

Mapper.compile_all()

Затем вы можете запросить какую -то конкретную страницу через:

pg = WikiPage.query.get(title='MyPage')
pg.comments # loads comments via a second query from MongoDB

Различные ODM, о которых я знаю для MongoDB в Python, перечислены ниже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top