mongoengine将文档嵌入到DynamicField中

时间:2013-08-19 23:38:01

标签: python mongodb 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')

然后我创建一个新文档并保存:

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中得到的结果:

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

但是现在,如果我请求文档并尝试从嵌入式文档中访问值,我会得到一个例外:

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

仅供参考:主要文档中的访问

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'>

看起来嵌入的文档未在对象中翻译。我不确定这是一个错误还是我误解了这个概念。谢谢你的建议。

2 个答案:

答案 0 :(得分:3)

在0.8.3中你必须手动重建它,这是一个错误 - 所以我打开了#449并修复了主人。 0.8.4将在本周晚些时候到期。

答案 1 :(得分:1)

引自docs

  

class mongoengine.EmbeddedDocument(* args,** kwargs)

     

一份文件   不存储在自己的集合中。应该使用EmbeddedDocuments   通过EmbeddedDocumentField字段类型在Documents上的字段。

您应该在EmbeddedDocumentField文档上定义DynamicField而不是Doc

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

希望有所帮助。