8

Web アプリの ORM コンポーネントとして Flask-MongoEngine で MongoDB を使用しています。

次のようにユーザー ドキュメント スキーマを構成しました。

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 ドキュメントを正しく使用していないように思えますが、どこが間違っているのかわかりません。

どんな助けでも大歓迎です!

4

1 に答える 1

11

特定のクラスの埋め込みドキュメント オブジェクトを作成し、それをメインのドキュメント クラスで使用するだけです。

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)

フィールドを宣言している間は、最初の例で示したようにオブジェクトを作成する必要はありません。

于 2013-07-26T06:20:46.033 に答える