MongoEngine的嵌入式文档问题

问题描述:

我正在使用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嵌入式文档,但我不知道自己出错的地方。

任何帮助将不胜感激!

那么你只需要创建特定类的嵌入文档对象,然后与主文档类中使用它,就像这样:

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

谢谢!这正是我需要知道的。一切都按预期工作! –