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)
同时宣布领域,这样我们就不必创建对象为在给定第一个例子。
或者默认创建嵌入文档:'db.EmbeddedDocumentField(UserSettings,default = UserSettings)'。 – tbicr
@tbicr啊,这很好,谢谢,编辑答案。 –
谢谢!这正是我需要知道的。一切都按预期工作! –