【问题标题】:Embedded Documents issue with MongoEngineMongoEngine 的嵌入式文档问题
【发布时间】:2013-07-26 05:17:51
【问题描述】:

我使用 MongoDB 和 Flask-MongoEngine 作为我的 Web 应用程序的 ORM 组件。

我已经像这样构建了用户文档架构:

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 Embedded 文档,但我不知道哪里出错了。

任何帮助将不胜感激!

【问题讨论】:

    标签: python mongodb flask mongoengine flask-mongoengine


    【解决方案1】:

    你只需要创建一个特定类的嵌入文档对象,然后将它与主文档类一起使用,如下所示:

    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)
    

    在声明字段时,这样我们就不需要创建第一个示例中给出的对象。

    【讨论】:

    • 或者默认创建嵌入文档:db.EmbeddedDocumentField(UserSettings, default=UserSettings).
    • 谢谢!这正是我需要知道的。现在一切正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多