2011-10-19 8 views
0

デフォルトではcollection.findまたはcollection.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という1人の主著者ですが、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() 

次にあなたが経由して、いくつかの特定のページを照会することができます:私はPythonでMongoDBのための知っている様々なODM企業が記載されています

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

以下。

+0

のように、私はまた、あなたは明のバリデータでフィールドの種類を設定することができることを言及する必要がありますですあなたはカスタムming.schema.SchemaItemを書くことでこれを行うことができます。 –

関連する問題