Almacenar una lista de diccionarios en GAE

Tengo una lista de aproximadamente 20 objetos y para cada objeto devuelvo una lista de 10 diccionarios.
Estoy tratando de almacenar la lista de 10 diccionarios para cada objeto en la lista en GAE; No creo que esté escribiendo el código correctamente para almacenar esta información en GAE.
Esto es lo que tengo: Antes de mi controlador de solicitudes principal, tengo esta clase:

class Tw(db.Model): tags = db.ListProperty() ip = db.StringProperty() 

En mi gestor de solicitudes principal tengo lo siguiente:

 for city in lst_of_cities: # this is the list of 20 objects dict_info = hw12.twitter(city) # this is the function to get the list of 10 dictionaries for each object in the list datastore = Tw() # this is the class defined for db.model datastore.tags.append(dict_info) # datastore.ip = self.request.remote_addr datastore.put() data = Data.gql("") #data entities we need to fetch 

No estoy seguro de si este código está escrito en absoluto. Si alguien pudiera ayudar por favor sería muy apreciado.

Bienvenido a Stack Overflow!

Veo algunos problemas:

  1. Los diccionarios no son tipos de valor admitidos para las propiedades de App Engine.
  2. Sólo estás almacenando la última entidad; El rest se desecha.
  3. Estás usando una propiedad de lista, pero en lugar de agregar cada elemento de dict_info, estás haciendo una sola adición de toda la lista.

Como no puede almacenar un diccionario sin formato dentro de una propiedad, debe serializarlo en algún otro formato, como JSON o pickle. Aquí hay un ejemplo revisado usando pickle:

 from google.appengine.ext import db import pickle class Tw(db.Model): tags = db.BlobProperty() ip = db.StringProperty() entities = [] for city in lst_of_cities: dict_info = hw12.twitter(city) entity = Tw() entity.tags = db.Blob(pickle.dumps(dict_info)) entity.ip = self.request.remote_addr entities.append(entity) db.put(entities) 

Cuando recupera la entidad más tarde, puede recuperar su lista de diccionarios con pickle.loads(entity.tags) .

Cuando trato con tipos de datos que Google App Engine no admite directamente, como diccionarios o tipos de datos personalizados, por lo general adopto la práctica PickleProperty .

 from google.appengine.ext import db import pickle class PickleProperty(db.Property): def get_value_for_datastore(self, model_instance): value = getattr(model_instance, self.name, None) return pickle.dumps(value) def make_value_from_datastore(self, value): return pickle.loads(value) 

Una vez declarada la clase PickleProperty en su módulo commons.py , puede usarla para almacenar sus datos personalizados con algo como esto:

 from google.appengine.ext import db from commons import PickleProperty class Tw(db.Model): tags = PickleProperty() ip = db.StringProperty() entities = [] for city in lst_of_cities: dict_info = hw12.twitter(city) entity = Tw() entity.tags = dict_info entity.ip = self.request.remote_addr entities.append(entity) db.put(entities) 

Para recuperar los datos vuelve con:

 entity.tags 

Desde que se escribió esto, App Engine ha implementado su modelo experimental de base de datos “ndb” de Python, que contiene en particular la propiedad Json, algo que implementa bastante bien lo que usted desea.

Ahora, necesita ejecutar la versión Python 2.7 de App Engine, que todavía no está lista para la producción, pero todo parece bastante estable en estos días. Parece que el propio GvR está escribiendo gran parte del código, lo que es un buen augurio para la Código de calidad, y tengo la intención de usar esto en producción en algún momento de este año …