Question

Par défaut les fonctions de collection.find ou collection.findone() résultats dans un dictionnaire types et si vous passez paramater as_class=SomeUserClass qu'il va essayer d'analyser le résultat dans ce format de classe. mais il semble que cette classe doit aussi être classe dérivée de dictionnaire (car il fallait fonction __setitem__ à définir et je peux ajouter des clés dans la classe). Ici, je veux définir les propriétés de la classe. comment puis-je faire parvenir? En outre, ma classe de collection contient quelques classes d'enfants en tant que propriétés .Donc comment puis-je définir les propriétés des classes d'enfants aussi.

Était-ce utile?

La solution 2

J'ai résolu ce problème en ajoutant __setitem__ en classe. que je fais

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

et dans mon __setitem__ de classe est comme

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

Autres conseils

On dirait que vous voulez quelque chose comme un mappeur objet-relationnel. Je suis l'auteur principal d'un Ming , mais il existe plusieurs autres pour Python aussi bien. Dans Ming, vous pouvez faire ce qui suit pour configurer votre application:

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

Ensuite, vous pouvez interroger pour une page particulière via:

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

Les différents ODMs que je connais pour MongoDB en Python sont énumérés ci-dessous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top