2013-07-26 67 views
5

我正在使用MongoDB和Flask-MongoEngine作爲我的Web應用的ORM組件。MongoEngine的嵌入式文檔問題

我已經構建了用戶文檔模式,像這樣:

from ..core import db 

class UserComics(db.EmbeddedDocument): 
    favorites = db.SortedListField(db.StringField(), default=None) 

class UserSettings(db.EmbeddedDocument): 
    display_favs = db.BooleanField(default=False) 
    default_cal = db.StringField(default=None) 
    show_publishers = db.ListField(db.StringField(), default=None) 

class UserTokens(db.EmbeddedDocument): 
    refresh_token = db.StringField(default=None) 
    access_token = db.StringField(default=None) 
    expire_time = db.StringField(default=None) 

class User(db.Document, UserMixin): 
    # Save User document to this collection 
    meta = {'collection': 'users_test'} 

    userid = db.StringField() 
    full_name = db.StringField() 
    first_name = db.StringField() 
    last_name = db.StringField() 
    gender = db.StringField() 
    birthday = db.StringField() 
    email = db.EmailField() 
    friends = db.ListField(db.StringField()) 
    date_creation = db.DateTimeField() 
    last_login = db.DateTimeField() 
    favorites = db.EmbeddedDocumentField(UserComics) 
    settings = db.EmbeddedDocumentField(UserSettings) 
    tokens = db.EmbeddedDocumentField(UserTokens) 

然而,當創建這樣一個新用戶(我已經離開了線......):

def create_new_user(resp): 
    newUser = User() 
    .... 
    newUser.settings.default_cal = resp['calendar'] 
    .... 
    newUser.save() 
    return 

我跑進入此錯誤:

AttributeError:'NoneType'對象沒有屬性'default_cal'

在我看來,我沒有正確使用MongoEngines嵌入式文檔,但我不知道自己出錯的地方。

任何幫助將不勝感激!

回答

7

那麼你只需要創建特定類的嵌入文檔對象,然後與主文檔類中使用它,就像這樣:

new_user = User() 
user_settings = UserSettings() 
user_settings.default_cal = resp['calendar'] 
new_user.settings = user_settings 
# more stuff 
new_user.save() 

注:只針對主文檔創建一個新的對象,不會自動創建相應的嵌入式文檔對象,但在讀取課程數據時情況不同。

編輯:

由於tbicr以下提到,我們也可以這樣做:

settings = db.EmbeddedDocumentField(UserSettings, default=UserSettings) 

同時宣佈領域,這樣我們就不必創建對象爲在給定第一個例子。

+7

或者默認創建嵌入文檔:'db.EmbeddedDocumentField(UserSettings,default = UserSettings)'。 – tbicr

+0

@tbicr啊,這很好,謝謝,編輯答案。 –

+1

謝謝!這正是我需要知道的。一切都按預期工作! –