2015-09-21 2 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, я получаю следующий документ.

{ 
    "_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" 
    } 
} 

Обратите внимание на пустой phone и gcm_details поле, и добавил push__phone и push__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()