Cambie IntegerProperty a FloatProperty de AppEngine DataStore existente

Construí una aplicación de appengine (python) que necesita convertir las entidades de almacén de datos existentes en valor entero (100) a valor flotante (100.00) para el problema de conversión de moneda. ¿Cómo es la forma correcta de hacer esto? Desde que mi consulta devolvió un error cuando solo cambio el tipo de propiedad en mi modelo.

Viejo modelo:

class Learn(search.SearchableModel): pid = db.ReferenceProperty(Product, collection_name='picks') title = db.StringProperty() description = db.TextProperty() order = db.IntegerProperty() cost = db.IntegerProperty(default=0) cost1 = db.IntegerProperty(default=0) 

Nuevo modelo:

 class Learn(search.SearchableModel): pid = db.ReferenceProperty(Product, collection_name='picks') title = db.StringProperty() description = db.TextProperty() order = db.IntegerProperty() cost = db.FloatProperty(default=0.000) cost1 = db.FloatProperty(default=0.000) 

Necesito una forma adecuada de alterar este tipo de propiedad del almacén de datos sin cambiar (eliminar datos antiguos y agregar nuevos) datos existentes. Ya que es clave utilizada en muchas otras tablas / modelos.

Gracias.

La forma más sencilla de hacer esto es cambiar el modelo para heredar de db.Expando y eliminar las propiedades enteras de la definición. Luego, cargue cada instancia y haga “instance.foo = float (instance.foo)” en cada una, antes de guardarlas de nuevo en el almacén de datos; probablemente querrá usar la API mapreduce para esto. Finalmente, haga que el modelo extienda db.Model nuevamente y agregue las propiedades FloatProperties.

Sin embargo, realmente no desea utilizar una flotación para la moneda: las flotillas son susceptibles de errores de redondeo, lo que significa que puede perder (o ganar) dinero. En su lugar, use una propiedad Integer que cuente la cantidad de centavos.

Aquí está un ejemplo de la respuesta de Nick Johnson :

Before

 class Person(db.Model): name = db.StringProperty() age = db.StringProperty() #this will go to int 

After

 class Person(db.Expando): pass for person in Person.all(): person.age = int(person.age) person.put() 

Very after

 class Person(db.Model): name = db.StringProperty() age = db.IntegerProperty() 

Tal vez una buena manera es crear temporalmente un nuevo modelo:

 class LearnTemp(search.SearchableModel): pid = db.ReferenceProperty(Product, collection_name='picks') title = db.StringProperty() description = db.TextProperty() order = db.IntegerProperty() order = db.IntegerProperty() cost = db.FloatProperty(default=0.000) cost1 = db.FloatProperty(default=0.000) 

Luego, escriba algún script, tarea o vista que convierta instancias del modelo anterior al modelo temporal, convirtiendo los valores enteros en flotantes. Asegúrate de copiar las identificaciones y las claves también si es posible.

Después de cambiar su modelo principal y copiar todas las entradas del temporal en él. A continuación, retire el modelo temporal.

Lo más probable es que esta no sea la forma óptima y requiera una migración manual, aunque sin South y en el motor de aplicaciones realmente no veo una buena manera de hacerlo.

Desde la página Editar entidad en la interfaz de administración del almacén de datos:

Introduzca la información para la entidad a continuación. Si desea cambiar el tipo de una propiedad, configúrelo en Nulo, guarde la entidad, edite la entidad nuevamente y cambie el tipo