2015-09-21 133 views
0

我有一個模型UserMongoEngine插入查詢

class User(db.DynamicDocument): 
    user_id = db.UUIDField(primary_key=True,required=True,default=uuid.uuid4) 
    name = db.StringField(default='') 
    phone = db.ListField(db.StringField,default=list) 
    gcm_details = db.ListField(db.EmbeddedDocumentField('UserGCM'),default=list) 

其中gcm_details是EmbeddedDocumentField其細節如下: -

class UserGCM(db.EmbeddedDocument): 
    gcm_key = db.StringField(default='') 
    device_id = db.StringField(default='') 

我執行插入查詢如下: -

name = 'something' 
phone = ['12345678','456789'] 
gcm_obj = UserGCM(gcm_key=gcm_key,device_id=device_id) 

user = User(name=name,push__phone=phone,push__gcm_details=gcm_obj).save() 

這會被保存。但是,當我在mongo shell中看到細節時,我得到以下文檔。

{ 
    "_id": BinData(3, 
    "MjpPJaNTQ823WuA8BP47jQ=="), 
    "parent_id": BinData(3, 
    "Ig7LNNAVQzCbjYG2KXvQjw=="), 
    "name": "something", 
    "phone": [ 

    ], 

    "gcm_details": [ 

    ], 

    "push__phone": [ 
     "9999999999" 
    ], 
    "push__gcm_details": { 
     "gcm_key": "string", 
     "device_id": "string", 
     "_cls": "UserGCM" 
    } 
} 

通知空phonegcm_details字段,並加入push__phonepush__gcm_details字段。這是怎麼發生的?

如果我這樣做只是

user = User(name=name,phone=phone,gcm_details=gcm_obj).save() 

不使用push__,它拋出一個錯誤說: -

TypeError: unbound method _validate() must be called with StringField instance as first argument (got unicode instance instead) 

這是怎麼回事這個?我在做什麼錯?

回答

1

你的錯誤是在這裏:

手機= db.ListField(db.StringField,默認=列表)

您應該使用StringField這樣的實例:

phone = db.ListField(db.StringField(), default=list) 

然後你就可以做你想做的事:

name = 'something' 
phone = ['12345678', '456789'] 
gcm = UserGCM(gcm_key=gcm_key, device_id=device_id) 
user = User(
    name=name, 
    phone=phone, 
    gcm_details=[gcm], 
).save()