2013-07-26 27 views
5

Tôi đang sử dụng MongoDB với Flask-MongoEngine làm thành phần ORM của tôi cho ứng dụng web của tôi.Vấn đề tài liệu được nhúng với MongoEngine

Tôi đã có cấu trúc sơ đồ tài liệu tài như vậy:

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) 

Tuy nhiên, Khi tạo một người dùng mới như thế này (tôi đã bỏ qua dòng ...):

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

tôi chạy vào lỗi này:

Thuộc tínhLỗi: đối tượng 'NoneType' không có thuộc tính 'default_cal'

Dường như với tôi rằng tôi không sử dụng tài liệu được nhúng MongoEngines chính xác nhưng tôi không biết tôi đang đi đâu sai.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

Trả lời

7

Vâng, bạn chỉ cần có để tạo ra một đối tượng tài liệu nhúng của lớp học đặc biệt, và sau đó sử dụng nó với lớp tài liệu chính, như vậy:

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

Lưu ý: Tạo một đối tượng mới chỉ dành cho các tài liệu chính , không tự động tạo các đối tượng tài liệu nhúng tương ứng (s), nhưng trong khi đọc dữ liệu của trường hợp thì khác nhau.

Edit:

Như tbicr đề cập dưới đây, chúng tôi cũng có thể làm điều này:

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

khi tuyên bố lĩnh vực này, như vậy chúng tôi sẽ không cần phải tạo ra các đối tượng như được đưa ra trong ví dụ đầu tiên.

+7

Hoặc tạo tài liệu được nhúng theo mặc định: 'db.EmbeddedDocumentField (UserSettings, default = UserSettings)'. – tbicr

+0

@tbicr ah, thật tuyệt, cảm ơn, chỉnh sửa câu trả lời. –

+1

Cảm ơn bạn! Đây chính xác là những gì tôi cần biết. Mọi thứ đang hoạt động như mong đợi ngay bây giờ! –