2011-10-19 27 views
0

默認情況下,collection.findcollection.findone()函數產生字典類型,如果通過參數as_class=SomeUserClass比它會嘗試將結果解析爲此類格式。 但似乎這個類也應該派生類的字典(因爲它需要__setitem__函數來定義,我可以在類中添加鍵)。 這裏我想設置類的屬性。我怎麼做到這一點? 另外,我的集合類包含一些子類作爲屬性。因此,我怎樣才能設置子類的屬性。PYMongo:解析|序列化集合的查詢輸出

回答

0

我已經解決了這個在類中添加__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 
0

這聽起來像你想要的東西像對象關係映射器。我是一個Ming的主要作者,但也有其他幾個Python。在明,你可以做以下設置你的映射:

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 

我知道的MongoDB的Python中的各種ODM廠商上市下面。

+0

我還要提到的是,你可以設置一個字段的類型,你明驗證,因此,如果你想使用自定義字典對象轉換器,你可以通過編寫一個自定義的ming.schema.SchemaItem來實現。 –