Google App Engine NDB: ¿Cómo almacenar la estructura del documento?

Desde la documentación de App Engine NDB:

La API de NDB proporciona almacenamiento persistente en un almacén de datos de objetos sin esquemas. Admite el almacenamiento en caché automático, consultas sofisticadas y transacciones atómicas. NDB está bien adaptado para almacenar registros de datos estructurados.

Quiero crear una estructura como la siguiente utilizando NDB, donde cada instancia se ve así:

{ city: 'SFO' date: '2013-01-27' data: { 'keyword1': count1, 'keyword2': count2, 'keyword3': count3, 'keyword4': count4, 'keyword5': count5, .... } } 

¿Cómo puedo diseñar tal entidad sin esquema en Google App Engine (GAE) usando NDB?
Soy nuevo en GAE y no estoy seguro de cómo lograrlo

Gracias

Si no necesita consultar los atributos en los datos, puede usar una de las propiedades mencionadas por @voscausa:

Jsonproperty

 class MyModel(ndb.Model): city = ndb.StringProperty() date = ndb.DateProperty() data = ndb.JsonProperty() my_model = MyModel(city="somewhere", date=datetime.date.today(), data={'keyword1': 3, 'keyword2': 5, 'keyword3': 1,}) 

Propiedad estructurada:

 class Data(ndb.Model): keyword = ndb.StringProperty() count = ndb.IntegerProperty() class MyModel(ndb.Model): city = ndb.StringProperty() date = ndb.DateProperty() data = ndb.StructuredProperty(Data, repeated=True) my_model = MyModel(city="somewhere", date=datetime.date.today(), data=[Data(keyword="keyword1", count=3), Data(keyword="keyword2", count=5), Data(keyword="keyword3", count=1)]) my_model.put() 

El problema aquí es filtrar propiedades estructuradas. Las propiedades de la palabra clave se ven como matrices paralelas. Haciendo una consulta como:

 q = MyModel.query(MyModel.data.keyword=='keyword1', MyModel.data.count > 4) 

incluiría incorrectamente my_model .

https://developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties

Usar un modelo de expando funcionaría y le permitiría consultar palabras clave:

 class MyModel(ndb.Expando): city = ndb.StringProperty() date = ndb.DateProperty() m = MyModel(city="Somewhere", date=datetime.date.today()) m.keyword1 = 3 m.keyword2 = 5 m.keyword3 = 1 m.put() q = MyModel.query(ndb.GenericProperty('keyword1') > 2) 

https://developers.google.com/appengine/docs/python/ndb/entities#expando

Puede usar ndb.JsonProperty para representar una lista de un diccionario o una cadena en su modelo. Puedes echar un vistazo a la documentación para más información.