2015-09-21 130 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()