2013-08-19 5 views
5

私は動的なフィールドにドキュメントを埋め込もうとしています。しかし、私が後でそれにアクセスしようとすると、それはもはやドキュメントオブジェクトではなく、ちょうどディクテーションです。DynamicFieldにmongoengineが埋め込まれたドキュメント

#defining the documents 
class Embed(EmbeddedDocument): 
    field_1 = StringField(db_field='f') 

class Doc(Document): 
    myid = IntField(required=True, unique=True, primary_key=True) 
    embed_me = DynamicField(db_field='e') 
    field_x = StringField(db_field='x') 

を、私は新しい文書を作成し、それを保存します:すべてがOKです

connect('test') 

# the embedded part 
embed = Embed(field_1='this is a test') 

# the document with the embedded document 
doc = Doc(pk=2) 
doc.embed_me = embed 
doc.save() 

これまでのところ、ここで

は私がちょうど作ったサンプルコードです。これは私がデシベルで得るものです:

# > db.doc.find() 
# { "_id" : 1, "e" : { "f" : "this is a test", "_cls" : "Embed" } } 

しかし、今、私はドキュメントを要求し、私は例外を取得埋め込まれた文書からの値にアクセスしようとした場合:ちょうど参照用

doc, c = Doc.objects.get_or_create(pk=1) 

:メインdocにアクセスが

print doc.field_x 
> None 

も参照して動作します:埋め込まれたドキュメントの名前が翻訳されていないことを除いてdictのは、大丈夫に見える

print doc.__dict__ 
> {'_created': False, '_data': {'myid': 1, 'embed_me': {u'_cls': u'Embed', u'f': u'this is a test'}, 'field_x': None}, '_changed_fields': [], '_initialised': True} 

と埋め込まれたドキュメントにアクセスしようとしながら、今、例外が

print doc.embed_me.field_1 
> File "embed_err.py", line 31, in <module> 
print doc.embed_me.field_1 
AttributeError: 'dict' object has no attribute 'field_1 

それがどのようなタイプで上昇?

type(doc.embed_me) 
> <type 'dict'> 

埋め込みドキュメントがオブジェクト内で翻訳されていないようです。これがバグか、私がそのコンセプトを誤解しているかどうかは分かりません。アドバイスありがとう。 docsから

答えて

2

0.8.3では、手動で再構築する必要があります。これはバグです。そのため、#449を開いてmasterに修正しました。今週末には0.8.4が予定されている。

+0

ありがとう。これはバグですので、次のリリースを待つことにします。 – manuel

+0

ちょうど新しいバージョンを得ました、今期待どおりに動作します。どうもありがとう。 – manuel

1

引用:

クラスmongoengine.EmbeddedDocument(* argsを、** kwargsから)

は、自身のコレクションに格納されていないことを文書。埋め込みドキュメントは、埋め込みドキュメントフィールドフィールドタイプを使用して、 をドキュメントのフィールドとして使用する必要があります。

あなたはDoc文書にEmbeddedDocumentField代わりのDynamicField定義する必要があります。助け

class Doc(Document): 
    myid = IntField(required=True, unique=True, primary_key=True) 
    embed_me = EmbeddedDocumentField(Post, db_field='e') 
    field_x = StringField(db_field='x') 

希望を。

+0

私はEmbeddedDocumentField型を認識しています。しかし、さまざまなタイプのフィールドを使いたいので、DynamicFieldを選択しました。これはすべてを格納できるはずだからです。 – manuel

+0

それを入手しましたが、一時的に 'EmbeddedDocumentField'に切り替えて、同じエラーをスローするかどうか確認できますか?それはありませんが、確認してください。 – alecxe

+0

EmbeddedDocumentFieldは正常に動作します。エラーはありません。あなたの答えには – manuel

関連する問題