2013-08-19 23 views
5

próbuję osadzić dokument w dynamicznym polu. Ale kiedy próbuję uzyskać do niego dostęp później, nie jest to już obiekt dokumentu, to tylko dyktando.mongoengine osadzone dokument w DynamicField

Oto przykładowy kod Właśnie składa się:

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

potem utworzyć nowy dokument i zapisać go:

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

Jak dotąd wszystko jest w porządku. To jest to, co mam w dB:

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

Ale teraz, jeśli mogę zażądać dokumentu i próby uzyskania dostępu do wartości z dokumentu osadzonego uzyskać wyjątek:

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

tylko dla odniesienia: dostęp w głównym doc działa

print doc.field_x 
> None 

również odniesienie: dict wygląda w porządku, poza tym, że nazwy z osadzonym dokumencie nie są tłumaczone

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} 

i teraz, podczas próby uzyskania dostępu do wbudowanego doc, wyjątek wznosi

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 

jakiego rodzaju to jest?

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

Wygląda na to, że osadzony dokument nie jest przetłumaczony na obiekt. Nie jestem pewien, czy to błąd, czy źle rozumiem koncepcję. Dzięki za jakąkolwiek radę.

Odpowiedz

2

W 0.8.3 trzeba będzie ręcznie odtworzyć go, który to błąd - więc otworzyłem #449 i utrwalono w pana. 0.8.4 jest należne w tym tygodniu.

+0

dzięki za odpowiedź. więc to jest błąd i poczekam na następne wydanie. – manuel

+0

właśnie dostałem nową wersję, działa teraz zgodnie z oczekiwaniami. wielkie dzięki. – manuel

1

Cytat docs:

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

dokumentu, który nie jest przechowywany w jego własnej kolekcji. Dokumenty EmbeddedDocuments powinny być używane jako pola w Dokumentach za pomocą typu pola EmbeddedDocumentField.

Należy zdefiniować EmbeddedDocumentField zamiast DynamicField na Doc dokumentu:

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

nadzieję, że pomoże.

+0

Jestem świadomy rodzaju EmbeddedDocumentField. Ale chcę używać pola dla różnych typów, więc wybrałem DynamicField, ponieważ powinno to być w stanie przechowywać wszystko. – manuel

+0

Rozumiem, ale można czasowy wyłącznik do 'EmbeddedDocumentField' i sprawdzić, czy to rzuca ten sam błąd, czy nie? To nie powinno, ale proszę sprawdź. – alecxe

+0

EmbeddedDocumentField działa poprawnie. Bez błędów. – manuel