Question

By default collection.find or collection.findone() functions results in a dictionary types and if you pass paramater as_class=SomeUserClass than it will try to parse the result into this class format. but it seems this class should also be derived class of dictionary (as it required __setitem__ function to be defined and i can add keys in the class ). Here i want to set the properties of the class. how can i do achieve this? Also, my collection class contains some child classes as properties .So how can i set the properties of child classes also.

Was it helpful?

Solution 2

I have solved this by adding __setitem__ in class. than i do

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

and in my class __setitem__ is like

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

OTHER TIPS

It sounds like you want something like an object-relational mapper. I am the primary author of one Ming , but there exist several others for Python as well. In Ming, you might do the following to set up your mapping:

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

Then you can query for some particular page via:

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

The various ODMs I know of for MongoDB in Python are listed below.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top