2013-08-19 2 views
5

나는 동적 필드에 문서를 삽입하려고합니다. 하지만 나중에 액세스하려고하면 더 이상 문서 객체가 아닙니다. 단지 딕트 (dict) 일뿐입니다. 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') 

그럼 내가 새 문서를 작성하여 저장 :

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

지금까지 모든 것이 괜찮 여기

내가 방금 만들어 놓은 예제 코드입니다. 단지 참조 용

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

: 나는 문서를 요청하고 포함 된 문서에서 값에 액세스하려고하면 내가 예외가 지금

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

그러나이 내가 DB에 무엇을 얻을 수 있습니다 : 주요 문서에 액세스

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

은 - 그래서 나는 #449을 열고 마스터에 고정. 이번 주말에 0.8.4가 발표 될 예정입니다.

+0

고마워. 그래서 이것은 버그이며 나는 다음 릴리스를 기다릴 것입니다. – manuel

+0

그냥 새 버전을 가지고, 예상대로 작동합니다. 고마워. – manuel

1

인용구 :

클래스 mongoengine.EmbeddedDocument (* 인수, ** kwargs로)

가 자신의 콜렉션에 저장되지 않도록 문서. EmbeddedDocument는으로 필드의 EmbeddedDocumentField 필드 형식을 통해 Documents에서 사용해야합니다.

당신은 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.8.3에서

+0

저는 EmbeddedDocumentField 유형을 알고 있습니다. 하지만 저는이 필드를 다른 유형에 사용하여 모든 것을 저장할 수 있어야하므로 DynamicField를 선택했습니다. – manuel

+0

알았지 만 임시로 'EmbeddedDocumentField'로 전환하여 동일한 오류가 발생하는지 여부를 확인할 수 있습니까? 그것은 shouldn '하지만 확인하시기 바랍니다. – alecxe

+0

EmbeddedDocumentField가 올바르게 작동합니다. 오류 없음. 너의 대답에 대해 – manuel

관련 문제