python - how - ndb properties
Google App Engine NDB: ¿cómo almacenar la estructura del documento? (2)
Puede usar ndb.JsonProperty
para representar una lista de un diccionario o una cadena en su modelo. Puede echar un vistazo a la documentación para más información.
De la documentación de App Engine NDB:
La API NDB proporciona almacenamiento persistente en un datastore de objetos sin esquema. Es compatible con el almacenamiento en caché automático, consultas sofisticadas y transacciones atómicas. NDB es muy adecuado para almacenar registros de datos estructurados.
Quiero crear una estructura como la siguiente usando 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 una entidad sin esquema en Google App Engine (GAE) usando NDB?
Soy nuevo en GAE y no estoy seguro de cómo lograr esto
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,})
StructuredProperty:
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 el filtrado de propiedades estructuradas. Las propiedades de la palabra clave se ven como matrices paralelas. Hacer 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 expansión funcionaría y le permitirá 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