Pregunta

Por defecto collection.find o collection.findone() Las funciones dan como resultado un tipo de diccionario y si pasa paramater as_class=SomeUserClass Entonces intentará analizar el resultado en este formato de clase. Pero parece que esta clase también debería ser derivada de la clase de diccionario (como se requiere __setitem__ función para definirse y puedo agregar claves en la clase). Aquí quiero establecer las propiedades de la clase. ¿Cómo puedo lograr esto? Además, mi clase de colección contiene algunas clases de niños como propiedades. Así que cómo puedo establecer las propiedades de las clases de niños también.

¿Fue útil?

Solución 2

He resuelto esto agregando __setitem__ en la clase. que yo

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

Y en mi clase __setitem__ es como

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

Otros consejos

Parece que quieres algo como un mapeador relacional de objetos. Soy el autor principal de uno Ming , pero también existen varios otros para Python. En Ming, puede hacer lo siguiente para configurar su mapeo:

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()

Luego puede consultar una página en particular a través de:

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

Los diversos ODM que conozco para MongoDB en Python se enumeran a continuación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top